Sto scrivendo l'applicazione Spring Boot utilizzando i repository Spring Data Rest e desidero negare l'accesso alla risorsa se il corpo della richiesta contiene JSON con proprietà sconosciute. Definizione di entità semplificata e repository:Errore PUT e POST su proprietà sconosciute Comportamento diverso molla
@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> {}
io uso funzione di deserializzazione di Jackson per non consentire proprietà sconosciute in JSONs.
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder(){
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.failOnUnknownProperties(true);
return builder;
}
Quando invio richieste POST, tutto funziona come previsto. Quando uso campi validi ottengo risposta corretta:
curl -i -x POST -H "Content-Type:application/json" -d '{"firstName": "Frodo", "lastName": "Baggins"}' http://localhost:8080/people
{
"firstName": "Frodo",
"lastName": "Baggins",
"_links": {...}
}
E quando invio JSON con campi sconosciuti applicazione genera aspettavo di errore:
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")
metodo PUT quando si utilizzano i rendimenti JSON validi risposta corretta pure. Tuttavia quando invio richiesta PUT con campo sconosciuto mi aspetto di primavera per lanciare l'errore, ma invece di che, gli aggiornamenti di primavera oggetto nel database e lo restituisce:
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": {...}
}
L'errore viene generato solo quando non ci sono oggetti nel database con data 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")
e 'un comportamento previsto o un bug in primavera dati Rest? Come posso generare un errore quando JSON con proprietà sconosciute viene passato all'applicazione indipendentemente dal metodo di richiesta?
Ho riprodotto questo comportamento modificando http://spring.io/guides/gs/accessing-data-rest/, l'unico cambiamento che ho fatto è Jackson2ObjectMapperBuilder
, nessun altro controller o repository sono in questo progetto.
Come si è tentato questa soluzione? [http://stackoverflow.com/a/14343479/3710490](http://stackoverflow.com/a/14343479/3710490) – Valijon
Hmm, ora non genera eccezioni anche con le richieste 'POST', immagino che funzioni out of the box solo con i controller e devo aggiungere altri bean per farlo funzionare con i repository. Lo proverò. – Infinity