【问题标题】:JSR 303 validations are not working for spring 4.0JSR 303 验证不适用于 spring 4.0
【发布时间】:2016-08-04 03:46:03
【问题描述】:

我正在使用 spring (4.2.0.RELEASE)、hibernate 验证器 (5.2.1.Final) 和验证 api (1.1.0.Final) 为后端应用程序使用以下配置进行 JSR 验证,

<bean id="validatorFactory" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource" />
</bean>

<bean class="org.springframework.expression.spel.standard.SpelExpressionParser" />

但没有一个 JSR 303 注释在我的应用程序中起作用。

注意:在 POJO 类上添加了 jsr 303 注释,在服务类(使用 POJO)上添加了 @Validated 也尝试在方法级别添加 @Validated。

更新:服务接口

@Validated 
public interface SampleService {

@NotNull
@Valid
Account getAccount( @NotNull @Valid String customerKey, @NotNull String name);

服务实现

@Service
@Validated
@Transactional( readOnly=true )
public class SampleServiceImpl
    implements SampleService
{
    private final SampleDao sampleDao;

@Inject
public SampleServiceImpl( SampleDao sampleDao)
{
    this.sampleDao= sampleDao;
}


@Override
@Validated
public Customer getAccount( String customerKey, String name)
{
    try {
        return sampleDao.getAccount( customerKey, name);
    }
    catch ( EmptyResultDataAccessException e ) {
        throw new NotFoundException( e );
    }
}

【问题讨论】:

  • 请显示您接收带有 JSR 验证注释的对象的方法。
  • 嗨,我已经更新了代码

标签: java spring validation hibernate-validator jsr


【解决方案1】:

有几点:

1- 您需要验证 POJO,因此创建一个 POJO 并使用您想要的验证对其进行注释,即:

public class Customer {

    @NotNull
    private String name;

    @NotNull
    private String customerKey;

    ...

}

2- @Valid 注解需要在实现上:

@Override
public Customer getAccount(@Valid Customer customer, BindingResult bindingResult) {}

3- 确保您的 Spring xml 中有 &lt;mvc:annotation-driven/&gt;

您的方法不需要BindingResult,但它会为您提供发现的验证错误,并允许您在发回响应之前对其进行处理。

【讨论】:

  • 嗨,它不工作:(而且我没有使用“mvc”。它是一个没有 UI 的后端应用程序。
  • UI 与否无关紧要。我有一个我广泛使用 JSR303 的 restapi,就像我在上面发布的一样。如果不查看整个项目,很难判断您缺少哪个配置。如果它只是一个模拟项目,请将其发布到 github,我可以看到缺少什么。您是否在第 3 项上添加了配置?
  • 你用的是同一个版本的jar吗?
  • Spring 4.2 和 HibernateValidator 5.2.4,不过没关系。这里的问题是配置。
【解决方案2】:

重复问题,请阅读此问题

Validation on service layer

此链接说明默认情况下,仅在控制器层中支持 spring 注释验证。对于服务层,你要么只是重用一些 spring 组件并调整一些配置,要么滚动你自己的 AOP。但我建议只选择前者。重复使用。

【讨论】:

    猜你喜欢
    • 2018-08-15
    • 2013-11-23
    • 2013-12-27
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2011-05-10
    相关资源
    最近更新 更多