Я пишу Spring приложение для загрузки с помощью репозиториев Spring Data Rest и я хочу запретить доступ к ресурсу, если тело запроса содержит JSON с неизвестными свойствами. Определение упрощенного объекта и хранилища:
@Entity
public class Person{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String firstName;
private String lastName;
/* getters and setters */
}
@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends CrudRepository<Person, Long> {}
Я использую функцию десериализации Джексона, чтобы запретить неизвестные свойства в JSON.
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder(){
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.failOnUnknownProperties(true);
return builder;
}
Когда я отправляю запросы POST, все работает так, как ожидалось. Когда я использую допустимые поля, я получаю правильный ответ:
curl -i -x POST -H "Content-Type:application/json" -d '{"firstName": "Frodo", "lastName": "Baggins"}' http://localhost:8080/people
{
"firstName": "Frodo",
"lastName": "Baggins",
"_links": {...}
}
И когда я отправляю JSON с неизвестными полями, приложение вызывает ожидаемую ошибку:
curl -i -x POST -H "Content-Type:application/json" -d '{"unknown": "POST value", "firstName": "Frodo", "lastName": "Baggins"}' http://localhost:8080/people
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "unknown" (class Person), not marked as ignorable (2 known properties: "lastName", "firstName")
Метод PUT при использовании действительного JSON также возвращает правильный ответ. Однако, когда я отправляю запрос PUT с неизвестным полем, я ожидаю, что Spring выдаст ошибку, но вместо этого Spring обновит объект в базе данных и вернет его:
curl -i -x PUT -H "Content-Type:application/json" -d '{"unknown": "PUT value", "firstName": "Bilbo", "lastName": "Baggins"}' http://localhost:8080/people/1
{
"firstName": "Bilbo",
"lastName": "Baggins",
"_links": {...}
}
Ошибка возникает только тогда, когда в базе данных с данным идентификатором нет объекта:
curl -i -x PUT -H "Content-Type:application/json" -d '{"unknown": "PUT value", "firstName": "Gandalf", "lastName": "Baggins"}' http://localhost:8080/people/100
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "unknown" (class Person), not marked as ignorable (2 known properties: "lastName", "firstName")
Ожидается ли поведение или ошибка в Spring Data Rest?. Как я могу сделать ошибку, когда JSON с неизвестными свойствами передается в приложение независимо от того, какой метод запроса?
Я воспроизвел это поведение, изменив http://spring.io/guides/gs/accessing-data-rest/, единственное изменение, которое я сделал, - Jackson2ObjectMapperBuilder
, никаких других контроллеры или репозитории находятся в этом проекте.