2014-08-30 73 views
3

將JAX-RS(在JBoss Wildfly容器中)與JSON有效內容和JPA輔助相結合時遇到一些問題。 Follwoing場景:在反序列化JAX-RS JSON對象時解析JPA關聯

有兩種JPA實體

@Entity 
class Organization { 
    @Id 
    private long id; 

    private String name; 
} 

@Entity 
class Empolyee { 
    @Id 
    private long id; 

    @Id 
    private String name; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JsonProperty("organization_id") 
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 
    @JsonIdentityReference(alwaysAsId = true) 
    private Organization organization; 
} 

接下來,我有一個JAX-RS服務創造具有以下簽名新員工:

@POST 
@Consumes({ "application/json" }) 
public Response create(final Employee employee) { 
} 

的JSON新員工由客戶端發送如下:

{ 
    "name" : "Sam Sample", 
    "organization_id" : 2 
} 

我的問題是,這個JSON(顯然)無法反序列化爲「Employee」的實例,因爲「organization_id」映射到相應的JPA實體失敗。

如何配置JAX-RS(或Jackson JSON映射器)將「orgainization_id」解釋爲JPA實體的ID?

+0

是你能解決這個問題呢? – Mark 2017-03-06 16:51:53

+0

我們通過引入DTO對象來解決這個問題,在將DTS對象合併到我們的工作單元之前,首先將其轉換爲JSON有效負載。不是很聰明,但它的作品... – woelfle 2017-05-16 14:37:45

回答

0

使用Jackson,您可以定義一個自定義解串器(請參閱thisthis),該數據庫根據organization_id的值獲取Organization實體。

編輯: 檢查這個例子爲如何配置使用傑克遜與自定義編程解串器(通過註釋相對)JAX-RS:

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class JacksonContextResolver implements ContextResolver<ObjectMapper> { 

    private ObjectMapper objectMapper; 

    public JacksonContextResolver() throws Exception { 
     this.objectMapper = new ObjectMapper().configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
     SimpleModule myModule = new SimpleModule("MyModule", new Version(1, 0, 0, null)); 
     myModule.addDeserializer(MyType.class, new MyTypeDeserializer()); 
     objectMapper.registerModule(myModule); 

    } 

    public ObjectMapper getContext(Class<?> objectType) { 
     return objectMapper; 
    } 
} 
+0

感謝您的提示。我已經嘗試編寫我自己的Jackson Deserializer,但是我還沒有找到關於如何將當前EntityManager實例注入Deserializer的任何文檔。 – woelfle 2014-08-31 07:52:43

+0

您如何註冊自定義解串器?如果你正在使用依賴注入,我認爲你應該能夠使用'@ PersistenceContext'註解來注入EntityManager。 – 2014-08-31 08:05:45

+0

我已經使用@JsonDeserialize註解註冊了反序列化器。還有其他註冊方法嗎? – woelfle 2014-08-31 08:09:00