#spring-boot #validation
#весенняя загрузка #проверка
Вопрос:
Я не понимаю, почему, когда я отправляю запрос POST с недопустимым numSeatAvailable
. Ошибка не возвращается. Я не знаю, пропустил ли я что-нибудь. Кто-нибудь может мне помочь, пожалуйста?
Это мой класс запросов
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import java.sql.Time;
import java.sql.Date;
@Setter
@Getter
@ToString
public class RideRequest {
private Date date;
private Time time;
private String destination;
private String modelName;
private int modelYear;
@Min(value = 18, message = "Age should not be less than 18")
@Max(value = 150, message = "Age should not be greater than 150")
private int numSeatAvailable;
private String rideIntro;
private Long driverId;
private Long rideId;
}
Это мой контроллер
@PostMapping("/createRide")
public String createRide(@Valid @RequestBody RideRequest rideRequest) {
System.out.println("Hello");
rideService.createRide(rideRequest);
return "created";
}
Комментарии:
1. Можете ли вы поделиться своим файлом build.gradle или pom.xml файл?
Ответ №1:
В вашем контроллере вы должны вернуть message, info, когда DTO недействителен.
Что касается проверки, у вас есть 3 способа:
(1) Добавить зависимость валидатора гибернации
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.6.Final</version>
</dependency>
Затем добавьте аннотации для компонента validate (DTO: объект передачи данных).
(2) Ах, у вас есть простой способ: используйте spring-boot-starter-validator
(он также является производным от Hibernate validator с предварительной и автоматической настройкой). Смотрите учебник по адресу https://reflectoring.io/bean-validation-with-spring-boot / . Я предлагаю вам использовать этот способ.
(3) Используйте проверку Java (стандартная библиотека). Руководство: https://spring.io/guides/gs/validating-form-input /
Ответ №2:
Вы можете использовать библиотеку javax.validation.constraints
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version><!--$NO-MVN-MAN-VER$ -->
</dependency>
Добавьте свои ограничения в свою модель DTO
, например :
@NotNull(groups = ProductCreation.class,message = "fieldName.notSetted")
@NotBlank(groups = ProductUpdate.class,message = "fieldName.notSetted")
@Min(value=1, message="fieldName must be equal or greater than 0")
И вы можете создать функцию для проверки :
private void checkIfReadyToSave(ClassDTO yourDTO) {
Set<ConstraintViolation<ClassDTO>> violations =
validator.validate(yourDTO, groupCreation.class);
if (!violations.isEmpty()) {
Map<String, Object> body = new LinkedHashMap<>();
Set<String> keys =
violations.stream().map(ConstraintViolation::getMessage).collect(Collectors.toSet());
body.put("errors", keys);
throw new BeanValidationException(ErrorConstants.ClassDTO_MISSING_ERROR_MSG, body.toString());
}
}