Ich benutze JPA, Jackson und JAX-RS auf folgende Weise.Wie man Jackson dazu bringt, nicht in Felder von @GeneratedValue zu schreiben?
Meine Einheit:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private long id;
private String name;
private int age;
public long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
Diese Klasse hat keine Setter für id
, weil es automatisch generiert wird. Selbst wenn ich den Setter setze, gibt es keinen Unterschied. Es macht mir nichts aus, wenn Jackson es braucht, aber es sollte sowieso nicht benutzt werden.
Dies ist die Ressource:
import java.io.IOException;
import javax.inject.Inject;
import javax.json.JsonObject;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.codehaus.jackson.map.ObjectMapper;
import com.test.persons.entity.Person;
@Path("persons")
public class PersonResource {
@Inject
PersonService service;
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response save(JsonObject inputPerson) {
ObjectMapper mapper = new ObjectMapper();
Person person = null;
try {
person = mapper.readValue(inputPerson.toString(), Person.class);
} catch (IOException e) {
e.printStackTrace();
}
service.save(person); // calls @PersistenceContext EntityManager#persist(person)
return Response.ok(person).build();
}
}
Das Problem ist, dass die inputPerson
mit seinem eigenen id
kommt die und person
ignoriert werden sollte sollte automatisch seine id
eigenen erzeugt haben. Aber Jackson benutzt die id
von inputPerson
, was zu einer Ausnahme in der JPA-Schicht führt (weil die @Id
falsch ist).
Was ich will, ist nur ein Person
Objekt mit den Eigenschaften der angegebenen Person
in JsonObject
Form und mit seiner automatisch generierten ID erstellen. Wie kann ich das erreichen?
Bitte beachte, dass ich, wenn ich eine Person
zu Json serialisiert String
mit
String s = mapper.writeValueAsString(person);
ich die id
brauchen serialisiert werden. Einfach nicht deserialisiert.
kommentieren, aber wenn ich das Person JSON Format schreibe wird es auch ignoriert? Ich habe am Ende eine Notiz hinzugefügt. – Mark
Ja, dann können Sie @JsonProperty verwenden (access = Access.READ_ONLY) – AntonBerezin
ich Fehler in Eclipse immer: 'Mehrere Marker an dieser Linie \t -Das Attribut Zugriff ist nicht definiert für die Annotationstyp \t JsonProperty \t -WRITE_ONLY kann nicht gelöst werden oder ist kein Feld? Vielleicht ist die Version alt? Wie überprüfe ich? Ich benutze Wildfly 10.1. – Mark