@postya

Как сделать валидацию значения в request body?

Делаю REST сервис на Spring Boot.

у меня есть метод, который сохраняет обьект. У обьекта есть поле activity с типом String.
Пользователь при post запросе может в json'e ввести любое значение. Мне это не нужно, надо сделать так,чтобы пользователь мог ввести только конкретные значения(например 'active' и 'inactive') иначе показать пользователю ошибку:
"activity should be active or inactive'

Как можно сделать такую валидацию?

Также хотелось бы сделать проверку на поле Date, чтобы вводилась дата по определенному формату, а не просто набор букв

Модель обьекта:
@Entity
@Table(name = "test")
public class Test {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String name;


    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    private LocalDate beginDate;


    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    private LocalDate endDate;


    private String activity;


Repository:

@Repository
public interface TestRepository  extends JpaRepository<Test, Integer> {

}


Service:

@Service
public class TestService {

    @Autowired
    private final TestRepository testRepository;

    public TestService(TestRepository testRepository) {
        this.testRepository = testRepository;
    }

    public Test saveTest(Test test) {
        return testRepository.save(test);
    }
}


Controller:

@RestController
@RequestMapping("/api/v1/")
public class TestController {

    @Autowired
    private final TestService testService;

    public TestController(TestService testService) {
        this.testService = testService;
    }

    //create test
    @PostMapping("test")
    public Test createTest(@RequestBody Test test) {
        
            return testService.saveTest(test);
    }
}


Post запроса выглядит так:

5e53679e889f6151396668.jpeg
  • Вопрос задан
  • 494 просмотра
Пригласить эксперта
Ответы на вопрос 2
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Попробуйте использовать enum вместо String в поле activity.
В gson (я их пользую но без спринга) например можно указать конкретное значение
@Entity
@Table(name = "test")
public  class Test {
public static enum Activity {  
    @SerializedName("active") ACTIVE,
    @SerializedName("inactive") INACTIVE
}
....
private Activity activity = Activity.INACTIVE;
}
Ответ написан
@Cheypnow
if (!"active".equals(test.getActivity()) || !"inactive".equals(test.getActivity())) {
    throw new YourCustomException();
}


Для YourCustomException создаете ExceptionHandler и отдаете пользователю нужный статус код и сообщение.
Например, 400:
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({YourCustomException.class})
public Object onYourCustomException(YourCustomException e) {
    return "activity should be active or inactive";
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы