Piszę aplikację Spring Boot, używając repozytoriów Spring Data Rest i chcę odmówić dostępu do zasobu, jeśli treść żądania zawiera JSON o nieznanych właściwościach. Definicja uproszczonej podmiotu i repozytorium:Niepowodzenie PUT i POST dla nieznanych właściwości Wiosenne różne zachowanie
@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> {}
używam funkcji deserializacjia Jacksona aby uniemożliwić nieznanych właściwości w JSONs.
Podczas wysyłania wniosków POST wszystko działa zgodnie z oczekiwaniami. Kiedy używać poprawnych pól uzyskać prawidłową odpowiedź:
curl -i -x POST -H "Content-Type:application/json" -d '{"firstName": "Frodo", "lastName": "Baggins"}' http://localhost:8080/people
{
"firstName": "Frodo",
"lastName": "Baggins",
"_links": {...}
}
I kiedy wysłać JSON z nieznanych pól aplikacja zgłosi błąd: oczekiwano
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")
metody PUT przy użyciu prawidłowego powraca JSON poprawną odpowiedź, jak również. Jednakże kiedy wysłać żądanie PUT z nieznanej dziedzinie spodziewam Wiosna wyrzucić błąd, ale zamiast tego, aktualizacje Wiosna obiektów w bazie danych i zwraca go:
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": {...}
}
Błąd jest generowany tylko wtedy, gdy nie ma żadnego obiektu w bazie danych ze względu id:
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")
Czy to oczekiwane zachowanie lub błąd w Spring Data Rest? Jak mogę rzucić błąd, gdy JSON z nieznanymi właściwościami jest przekazywany do aplikacji bez względu na metodę żądania?
Mam powielana ten problem modyfikując http://spring.io/guides/gs/accessing-data-rest/, jedyna zmiana Zrobiłem to Jackson2ObjectMapperBuilder
, żadne inne sterowniki lub repozytoria są w tym projekcie.
Jak próbowałem tego rozwiązania? [http://stackoverflow.com/a/14343479/3710490](http://stackoverflow.com/a/14343479/3710490) – Valijon
Hmm, teraz nie wyrzuca wyjątku nawet z prośbą o "POST", chyba to działa po wyjęciu z pudełka tylko z kontrolerami i muszę dodać kilka innych komponentów, aby działał z repozytoriami. Spróbuję tego. – Infinity