2017-05-18 1 views
0

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.

Antwort

0

Sie können Ihr Feld id mit @JsonIgnore Annotation markieren, auf diese Weise wird Jackson Json dieses Feld vollständig ignorieren.

Upd. Wenn Sie dieses Feld ignorieren möchten, wenn Sie das Objekt deserialisieren, aber es beim Serialisieren verwenden, könnte @JsonProperty(access = Access.READ_ONLY) nützlich sein. Oder Sie können versuchen, Setter mit @JsonIgnore.

+0

kommentieren, aber wenn ich das Person JSON Format schreibe wird es auch ignoriert? Ich habe am Ende eine Notiz hinzugefügt. – Mark

+0

Ja, dann können Sie @JsonProperty verwenden (access = Access.READ_ONLY) – AntonBerezin

+0

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

Verwandte Themen