Spring 4.1.7 проверить тело запроса - PullRequest
0 голосов
/ 07 декабря 2018

Я знаю, что эта проблема уже была в другом посте, но после применения предложенного fiux не работал.

Я использую версию весны 4.1.7, я хочу проверить RequestBody от post rest call,Для этого я попробовал следующий набор кодов, но он не работал, как я ожидал.

Мои классы 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 ожидал обработать этот запрос как BadЗапрос.вместо этого он принимает тело запроса и обрабатывает его дальше.

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

1 Ответ

0 голосов
/ 07 декабря 2018

Посмотрите на этот вопрос Здесь

Вам нужно украсить ребенка pojo как @Valid

public class ParentPojo<T> implements Serializable{
   @NotNull
   private String  cNumber;
   @NotNull
   private String  statusCode;
   @Valid 
   @NotNull 
   T child;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...