У меня есть контроллер Spring REST, который возвращает следующую полезную нагрузку JSON:
[
{
"id": 5920,
"title": "a title"
},
{
"id": 5926,
"title": "another title",
}
]
Контроллер REST с соответствующим методом запроса на получение:
@RequestMapping(value = "example")
public Iterable<Souvenir> souvenirs(@PathVariable("user") String user) {
return new souvenirRepository.findByUserUsernameOrderById(user);
}
Теперь класс Souvenir — это pojo:
@Entity
@Data
public class Souvenir {
@Id
@GeneratedValue
private long id;
private String title;
private Date date;
}
Относительно https://www.owasp.org/index.php/OWASP_AJAX_Security_Guidelines#Always_return_JSON_with_an_Object_on_the_outside и http://haacked.com/archive/2009/06/25/json-hijacking.aspx/ Я хотел бы обернуть ответ внутри объекта, чтобы он не был уязвим для атак. Конечно, я мог бы сделать что-то вроде этого:
@RequestMapping(value = "example")
public SouvenirWrapper souvenirs(@PathVariable("user") String user) {
return new SouvenirWrapper(souvenirRepository.findByUserUsernameOrderById(user));
}
@Data
class SouvenirWrapper {
private final List<Souvenir> souvenirs;
public SouvenirWrapper(List<Souvenir> souvenirs) {
this.souvenirs = souvenirs;
}
}
Это приводит к следующей полезной нагрузке JSON:
{
"souvenirs": [
{
"id": 5920,
"title": "a title"
},
{
"id": 5926,
"title": "another title",
}
]
}
Это помогает предотвратить некоторые атаки JSON/Javascript, но мне не нравится многословность класса Wrapper. Конечно, я мог бы обобщить описанный выше подход с помощью дженериков. Есть ли другой способ добиться того же результата в экосистеме Spring (с аннотацией или чем-то подобным)? Идея заключалась бы в том, что поведение выполняется Spring автоматически, поэтому всякий раз, когда есть контроллер REST, который возвращает список объектов, он может обернуть эти объекты в оболочку объекта, чтобы прямой список объектов не был сериализован?