Я пишу контроллер, который принимает массив json с отелями и проверяет его перед сохранением.Например:
[
{
"name": "Hotel_1",
"address": "address_1",
"starsNumber": 3
},
{
"name": "Hotel_2",
"address": "address_2",
"starsNumber": 4
},
{
"name": "Hotel_2",
"address": "address_2",
"starsNumber": 3
}
]
Сначала я использовал List<hotel>
вместо WrapList<Hotel>
в качестве RequestBody, но это не сработало.Поэтому я попытался обернуть его в объект обтекания, как я читал в этой теме тема stackoverflow , но он не работает так же хорошо, и я всегда получаю пустой список в своем объекте WrapList.Таким образом, вопрос заключается в том, как правильно проверить список объектов.
Если я использую List вместо WrapList в моей подписи контроллера, тогда мой BindingResult никогда не будет иметь ошибок вместо отправки неверных данных.
Это моя модель отеля:
@Entity(name = "Hotel")
public class Hotel {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotBlank
@Column(unique = true)
private String name;
private String address;
@Range(min = 0, max = 5)
private int starsNumber;
@OneToMany(mappedBy = "hotel", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@Valid
private List<Reservation> reservationList = new ArrayList<>();
public Hotel() {
}
public Hotel(String name, String address, int starsNumber, ArrayList<Reservation> reservationList) {
this.name = name;
this.address = address;
this.starsNumber = starsNumber;
this.reservationList = reservationList;
}
public List<Reservation> getReservationList() {
return reservationList;
}
public void setReservationList(List<Reservation> reservationList) {
this.reservationList = reservationList;
}
@Override
public String toString() {
return String.format(
"Hotel[id=%d, name='%s', address='%s', starts=%d]\"", id, name, address, starsNumber
);
}
public void addReservation(Reservation reservation){
reservationList.add(reservation);
reservation.setHotel(this);
}
}
Это мой класс WrapList:
class WrapList<E> implements List<E>{
@Valid
@NotEmpty
private List<E> list = new ArrayList<>();
public WrapList() {
}
public WrapList(@Valid List<E> hotelList) {
this.list = hotelList;
}
public List<E> getList() {
return list;
}
public void setList(List<E> list) {
this.list = list;
}
@Override
public int size() {
return list.size();
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
@Override
public boolean contains(Object o) {
return false;
}
@Override
public Iterator<E> iterator() {
return list.iterator();
}
@Override
public Object[] toArray() {
return list.toArray();
}
Это мой контроллер покоя:
@PostMapping("/create-many-test/")
public ResponseEntity createManyTest(@Valid @RequestBody WrapList<Hotel> wrapHotelList, BindingResult bindingResult) {
System.out.println(wrapHotelList.getList().toString());
if (bindingResult.hasErrors()){
return new ResponseEntity<>(bindingResult.getFieldErrors(), HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(wrapHotelList.getList(), HttpStatus.CREATED);
}