java - @Validated 未考虑

标签 java validation spring-mvc bean-validation

我设置了一个非常简单的 REST 服务,并开始使用 Bean 验证来验证它。一切工作正常,直到我注意到我需要对同一对象使用不同的方法进行不同的验证。

我尝试了组验证。 我的问题是,当我用 @Validated(Group.class) 注释替换我的功能 @Valid 注释时,不再进行验证。

这是我的对象和配置文件:

终点:

 <jaxrs:server id="myRestServices" address="/v1">
    <jaxrs:serviceBeans>
        <ref bean="rentalsService"/>
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <ref bean="jsonProvider"/>
    </jaxrs:providers>
    <jaxrs:inInterceptors>
        <ref bean="validationInInterceptor" />
    </jaxrs:inInterceptors>
</jaxrs:server>
    <bean id="validationProvider" class="org.apache.cxf.validation.BeanValidationProvider" />
<bean id="validationInInterceptor" class="org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInInterceptor">
     <property name="provider" ref="validationProvider" />
</bean>

服务:

public interface RentalsService {

public Rental createRental(@Validated({ CreateValidationGroup.class }) Rental rental);

public Rental updateRental(String RentalId, @Validated({ UpdateValidationGroup.class }) Rental rental);

服务实现

@Path("/rentals")
@Produces(MediaType.APPLICATION_JSON)
public class RentalServiceImpl implements RentalsService {

private RentalBusinessService rentalBusinessService;

@POST
@Override
@Consumes(MediaType.APPLICATION_JSON)
public Rental createRental(@Validated({ CreateValidationGroup.class }) Rental rental) {
    return rentalBusinessService.createRental(rental);
}

@PUT
@Override
@Path("/{RentalId}")
@Consumes(MediaType.APPLICATION_JSON)
public Rental updateRental(@PathParam("RentalId") String RentalId, @Validated({ UpdateValidationGroup.class }) Rental rental) {
    return rentalBusinessService.updateRental(RentalId, rental);
}

` 所述组:

    public interface CreateValidationGroup {

}  public interface UpdateValidationGroup {

}

最后是对象:

public class Rental {   

@Size(min = 2, max = 14, groups = { UpdateValidationGroup.class }, message = " 2 < Status < 4 ") 
private String status;


@NotNull
@Size(min = 2, max = 14, message = " 2 < Product < 4 ")
private String product;

@Size(min = 2, max = 14, groups = { CreateValidationGroup.class }, message = " 2 < ID < 4 ")
private String RentalId;

我可以不这样使用组验证吗?将 @Validated 切换回 @Valid 会触发验证。

最佳答案

所以我继续手动完成:

注入(inject)了一个 Smartvalidator,并在指定组时调用我的对象的验证方法。这正是我试图避免的......

private SmartValidator validator;

private RentalBusinessService rentalBusinessService;

@POST
@Override
@Consumes(MediaType.APPLICATION_JSON)
public Rental createRental(Rental rental) {

    Errors errors = new BeanPropertyBindingResult(rental, "rental");
    validator.validate(rental, errors, CreateValidationGroup.class);

    if (errors.hasErrors()) {
       //dostuff
    }

以及注入(inject)的bean:

<bean id="smartValidator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

如果有人知道如何通过注释来做到这一点,我仍然想知道我哪里出错了。

关于java - @Validated 未考虑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26528538/

相关文章:

mysql - 创建类路径资源 [spring/application-config.xml] 中定义的名称为 'elasticsearchTemplate' 的 bean 时出错

java - Spring URL : There's a difference between "/test" and "/test/" in the controller mapping

Java 或 Dot Net 用于服务器端 Flash 支持

java - JAVA/J2EE 中的组合生成器

java Set<int[]> 与 Set<List<Integer>>

PHP -> 正则表达式 |密码验证不起作用

java - XSLT 自定义函数返回节点集或 XML 片段(非简单数据类型)

html - Fontawesome 的使用令 W3C Validator 不满意

javascript - 如何显示数字输入类型的自定义验证消息

java - 为什么仅当我的 Controller 具有@RequestMapping (produces = ...) 时,Spring 的 HandlerInterceptorAdapter 才会被调用两次?