簡體   English   中英

Spring + Hibernate驗證:拋出Hibernate Exceptions而不是Spring異常

[英]Spring+Hibernate validation: throws Hibernate Exceptions and not Spring exceptions

我有一個簡單的項目(詳見下文),它有一個Spring bean,並使用HV作為驗證提供程序,用於方法參數驗證。

問題:驗證失敗時,會拋出Hibernate異常( org.hibernate.validator.method.MethodConstraintViolationException )。 但我希望它拋出Spring異常( org.springframework.web.bind.MethodArgumentNotValidException ),因為Spring是包裝接口。 據我所知,我不關心誰是驗證實現者,只需要處理Spring定義的類。

問題1:上述論點是否正確,是否應該拋出Spring異常?

問題2:如果Hibernate異常是常態,我如何將其映射到友好消息(在Google上找不到此信息)

ProductManager.java:

@Component
@Validated
public class ProductManager {

    public void createProduct(@Valid Product product) {

    }
}

Product.java:

public class Product {

    private int id;

    @NotNull
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Tester.java:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/META-INF/applicationContext.xml"})
public class Tester {

    @Autowired
    ProductManager productManager;

    @Test
    public void testCreateProduct() {
        Product p = new Product();

        try {
            productManager.createProduct(p);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

applicationContext.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <context:annotation-config />
    <context:component-scan base-package="com.gammay.example" />

    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <qualifier value="validator"/>
    </bean>

    <bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>

</beans>

Tester.java中打印的異常:

org.hibernate.validator.method.MethodConstraintViolationException:發生以下約束違規:[MethodConstraintViolationImpl [method = public void com.gammay.example.core.ProductManager.createProduct(com.gammay.example.model.Product),parameterIndex = 0, parameterName = arg0,kind = PARAMETER,message = may not null,messageTemplate = {javax.validation.constraints.NotNull.message},rootBean = com.gammay.example.core.ProductManager @ 12e79d0,rootBeanClass = class com.gammay。 example.core.ProductManager,leafBean = com.gammay.example.model.Product @ 92acdc,invalidValue = null,propertyPath = ProductManager #createProduct(arg0).name,constraintDescriptor = ConstraintDescriptorImpl {annotation = javax.validation.constraints.NotNull,payloads = [],hasComposingConstraints = true,isReportAsSingleInvalidConstraint = false,elementType = FIELD,definedOn = DEFINED_LOCALLY,groups = [interface javax.validation.groups.Default],attributes = {message = {javax.validation.constraints.NotNull.message},有效載荷= [Ljava.lang。 類; @ 7ce531,groups = [Ljava.lang.Class; @ 1ab0086}}]] org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:91)...

如果你看一下spring的MethodValidationInterceptor的內部工作原理, MethodValidationInterceptor有一個private static class HibernateValidatorDelegate Spring正在調用配置Hibernate的HibernateValidator ,它正在進行實際的實際驗證,因此為什么你會看到org.hibernate.validator.method.MethodConstraintViolationException

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM