Spring + Hibernate验证:抛出Hibernate Exceptions而不是Spring异常

时间:2014-06-06 14:02:47

标签: java spring hibernate validation

我有一个简单的项目(详见下文),它有一个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:The   发生以下约束违规:   [MethodConstraintViolationImpl [method = public void   com.gammay.example.core.ProductManager.createProduct(com.gammay.example.model.Product),   parameterIndex = 0,parameterName = arg0,kind = PARAMETER,message = may not may   是的,   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 {注释= javax.validation.constraints.NotNull,   payloads = [],hasComposingConstraints = true,   isReportAsSingleInvalidConstraint = false,elementType = FIELD,   definedOn = DEFINED_LOCALLY,groups = [interface   javax.validation.groups.Default]   属性= {消息= {} javax.validation.constraints.NotNull.message,   有效载荷= [Ljava.lang.Class; @ 7ce531,   groups = [Ljava.lang.Class; @ 1ab0086}}]] at   org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:91)   ...

1 个答案:

答案 0 :(得分:1)

如果你看一下spring MethodValidationInterceptor的内部工作原理,buildValidatorFactory中就有一个private static class HibernateValidatorDelegate。 Spring正在调用配置Hibernate的HibernateValidator,它正在进行实际的真实验证,因此为什么你会看到org.hibernate.validator.method.MethodConstraintViolationException