#java #validation #lombok
#java #проверка #ломбок
Вопрос:
Я пытаюсь проверить объект запроса, класс которого выглядит следующим образом:
@Value
@NoArgsConstructor(force = true, access = AccessLevel.PRIVATE)
@AllArgsConstructor
public class SomeCreateRequest {
@NotNull(message = "Name can not be null")
@NotBlank(message = "Name can not be empty")
String name;
}
Без NoArgsConstructor проверка работает, но операция POST завершается с ошибкой HttpMessageNotReadableException; с NoArgsConstructor операция POST завершается успешно, но проверка не работает.
Что я делаю не так?
PS используя Java 8, Spring 2.3.4.RELEASE, javax.validation 2.0.1.Final, и мой контроллер выглядит следующим образом:
@RequiredArgsConstructor
@RestController
@RequestMapping("/api")
public class MyController {
private final MyService myService;
@PostMapping()
public MyResponse submit(@Valid @RequestBody SomeCreateRequest request){
return myService.create(request);
}
}
Комментарии:
1. используете ли вы
@Valid
в контроллере? будьте осторожны@NoArgsConstructor(force = true, access = AccessLevel.PRIVATE)
с этим, потому что десериализатору Jackson нужен конструктор без аргументов, можете ли вы привести пример аннотаций вашего контроллера, которые вы используете?2. Да, я использую @Valid в своем контроллере. Смотрите мое редактирование вопроса.
3. Для создания объекта требуется конструктор без аргументов или метаданные JSON, чтобы знать, какой конструктор вызывать. Тот факт, что проверка не работает, вероятно, из-за того, что вы добавили
javax.validation
в качестве зависимости, тогда как вы должны были использоватьspring-boot-starter-validation
. Последнее включает в себя как API, так и реализацию, добавление только API ничего не дает.