【问题标题】:Spring 4.1.7 validate request bodySpring 4.1.7 验证请求正文
【发布时间】:2018-12-07 06:20:32
【问题描述】:

我知道这个问题在其他帖子中已经存在,但是在应用建议的 fiux 后不起作用。

我使用的是 spring 4.1.7 版本,我想从 post rest 调用中验证 RequestBody。为此,我尝试了以下一组代码,但没有按预期工作。

我的请求正文 pojo 类。

ParentPojo.class

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
@Validated
public class ParentPojo<T> implements Serializable{
    @NotNull
    private String  cNumber;
    @NotNull
     private String  statusCode;
     @NotNull T child;
}

ChildPojo.class

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
@Validated
public class ChildPojo{

    @NotNull
    private String name;

    @NotNull
    private String address;

    @NotNull
    private String pin;

}

控制器:

仅添加方法

@Autowired
    @Qualifier("validator")
    private Validator validator;

    @InitBinder
    private void initBinder(WebDataBinder binder) {
        binder.setValidator(validator);
    }

 @RequestMapping(produces = { "application/json", "application/xml" }, consumes ={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}, method = { RequestMethod.POST })
    @ResponseStatus(HttpStatus.CREATED)
    public Messageresponse<ChildPojo> create(@NotNull(groups = {ParentPojo.class, ChildPojo.class}) 
    @Valid @Validated({ParentPojo.class, ChildPojo.class}) @RequestBody final ParentPojo<ChildPojo> ParentPojo, BindingResult bindingResult) {
       System.out.println("new version 8="+bindingResult.hasErrors());
       validator.validate(ParentPojo, bindingResult);
       if(bindingResult.hasErrors()) {
           System.out.println("Non formated form stuff.");
       }

        return service.create(ParentPojo);
    }

 @RequestMapping(value = "/{create}", produces = { "application/json", "application/xml" }, consumes ={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}, method = { RequestMethod.POST })
    @ResponseStatus(HttpStatus.CREATED)
    public Messageresponse<ChildPojo> create1(@NotNull @Valid @RequestBody final ParentPojo<ChildPojo> ParentPojo, BindingResult bindingResult) {
       System.out.println("new version 8="+bindingResult.hasErrors());
       validator.validate(ParentPojo, bindingResult);
       if(bindingResult.hasErrors()) {
           System.out.println("Non formated form stuff.");
       }

        return service.create(ParentPojo);
    }

应用程序上下文 xml:

<mvc:annotation-driven validator="validator">
    </mvc:annotation-driven>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

jar 文件尝试:

hibernate-validator-4.3.0.Final
hibernate-validator-4.1.0.Final
hibernate-validator-4.0.2.GA
validation-api-1.1.0.Final
spring-context-4.1.7.RELEASE

但是对于以下请求,上述所有组合都没有任何效果:

在下面的请求“pin”中丢失,控制器方法@Valid @RequestBody 预计将此请求作为错误请求处理。相反,它正在接受请求正文并进一步处理。

{
"cNumber" : "ff",
"statusCode" : "ddd",
"child" : {
"name" : "ll",
"address" : "ll"
}

【问题讨论】:

    标签: spring rest


    【解决方案1】:

    看这个问题Here

    您需要将孩子 pojo 装饰为@Valid

    public class ParentPojo<T> implements Serializable{
       @NotNull
       private String  cNumber;
       @NotNull
       private String  statusCode;
       @Valid 
       @NotNull 
       T child;
    }
    

    【讨论】:

    • 不,它不起作用。我正在使用休眠 5.3.6.Final 和 Validation-api-1.1.0.Final
    猜你喜欢
    • 2020-10-18
    • 2020-03-14
    • 2018-08-08
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多