2017-05-18 13 views
0

JPA、ジャクソン、JAX-RSは次のように使用しています。Jacksonを@GeneratedValueフィールドに書き込まないようにするにはどうすればいいですか?

マイエンティティ:それは自動生成されているため

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 + "]"; 
    } 
} 

このクラスはidのためのセッターを持っていません。私がセッターを置いても、違いはありません。ジャクソンがそれを必要とするなら、私はそれを持っていても構いませんが、とにかく使用すべきではありません。 inputPersonは自動id、独自に生成している必要があり、それ自身は無視されなければならないidpersonが付属していることを

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(); 
    } 
} 

問題がある:

この

はリソースです。しかし、Jacksonは idinputPersonから使用しています( @Idが間違っているため)JPAレイヤーで例外が発生します。

Personのプロパティとのプロパティを持つPersonオブジェクトを作成し、その自動生成IDを使用してオブジェクトを作成します。それをどうすれば実現できますか?私は私がidが必要なのです

String s = mapper.writeValueAsString(person); 

でJSON StringからPersonをシリアライズ

注意が直列化されます。デシリアライズされません。

答えて

0

id@JsonIgnoreという注釈を付けると、Jackson Jsonはこのフィールドを完全に無視します。

Upd。 オブジェクトを逆シリアル化するときにそのフィールドを無視したいが、シリアル化するときにそのフィールドを使用する場合は、@JsonProperty(access = Access.READ_ONLY)が便利です。または、セッターに注釈を付けることができます@JsonIgnore.

+0

しかし、JSON形式にPersonを書き込むと無視されますか?私は最後にメモを付けました。 – Mark

+0

はい、あなたは@JsonProperty(アクセス= Access.READ_ONLY) – AntonBerezin

+0

を使用することができます私は、Eclipseのエラーを取得しています: 'この行に複数マーカー \t -The属性アクセスは注釈型 \tのために定義されていませんJsonProperty \t -WRITE_ONLY解決できないか、フィールドではありません。バージョンが古いのかもしれませんか?どうすれば確認できますか?私はWildfly 10.1を使用しています。 – Mark

関連する問題