2016-09-06 87 views
1

我有一個端點,它接受DriverJson類實例作爲http請求負載。 DriverJson類有一個屬性userId這是java.util.UUID類型。 問題是澤西島無法反序列化UUID字符串到UUID對象。當我調試driverJson時,userId1屬性是null(幸運的是它不會拋出異常)。我讀過這篇文章(article),它解釋了具有fromString(String string)方法(java.util.UUID)的類或具有一個(String)參數的構造函數由Jersey自動反序列化(無需編寫任何額外的反序列化器類)。如果我將UUID類型更改爲String,並將其轉換爲我的自我(UUID.fromString(userId)),它的工作完美。Jersey無法將java.util.UUID反序列化爲請求對象中的字符串

另外我在我的一些端點中使用了一個@PathParam UUID參數,並且它們完美地工作(如預期的那樣)。

下面是我的代碼:

我的資源端點:

@POST 
public Response add(DriverJson driverJson) { 
    DriverJson driver = service.add(driverJson); 
    return Response.status(Response.Status.CREATED).entity(driver).build(); 
} 

我Driver類:

@XmlRootElement 
public class DriverJson { 

    private UUID id; 
    private String name; 
    private UUID userId; 

    public DriverJson() {} 

    public DriverJson(UUID id, String name, UUID userId){ 
     this.id = id; 
     this.name = name; 
     this.userId = userId; 
    } 


    /// getters & setters ///////// 

    public UUID getId() { 
     return id; 
    } 

    public void setId(UUID id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public UUID getUserId() { 
     return userId; 
    } 

    public void setUserId(UUID userId) { 
     this.userId = userId; 
    } 
} 

我的JSON請求對象:

{ 
    "name" : "John", 
    "userId" : "ff06c5a4-135c-40b7-83f3-3648ec035efc" 
} 

我使用標準的澤西拱門VLAN時(版本2.23.2)具有以下依存關係:

<dependencies> 
     <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-servlet-core</artifactId> 
      <!-- use the following artifactId if you don't need servlet 2.x compatibility --> 
      <!-- artifactId>jersey-container-servlet</artifactId --> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.media</groupId> 
      <artifactId>jersey-media-moxy</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-api</artifactId> 
      <version>7.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.mongodb</groupId> 
      <artifactId>mongo-java-driver</artifactId> 
      <version>3.3.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.bouncycastle</groupId> 
      <artifactId>bcprov-jdk15on</artifactId> 
      <version>1.50</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.guava</groupId> 
      <artifactId>guava</artifactId> 
      <version>16.0.1</version> 
     </dependency> 
     <dependency> 
      <groupId>com.auth0</groupId> 
      <artifactId>java-jwt</artifactId> 
      <version>2.2.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.code.gson</groupId> 
      <artifactId>gson</artifactId> 
      <version>2.7</version> 
     </dependency> 
    </dependencies> 

回答

1

AFAIK您可以通過使用自定義XmlAdapter修復:

public class UUIDAdapter extends XmlAdapter<String, UUID> { 

    @Override 
    public UUID unmarshal(String v) throws Exception { 
     return UUID.fromString(v); 
    } 

    @Override 
    public String marshal(UUID v) throws Exception { 
     return v.toString(); 
    } 
} 

然後用@XmlJavaTypeAdapter註釋標記你的領域

@XmlRootElement 
public class DriverJson { 

    @XmlJavaTypeAdapter(UUIDAdapter.class) 
    private UUID id; 
    @XmlJavaTypeAdapter(UUIDAdapter.class) 
    private UUID userId; 

    /* ... */ 
} 
+0

我試過你的解決方案,它的工作原理,但我不明白爲什麼我必須編寫自定義適配器,當澤西島應該知道如何確定把它從盒子裏取出來?我也不明白Jersey如何將String @PathParam反序列化爲UUID,但是當請求對象時,它不能? – anchor

+0

@anchor我的解決方案適用於'jaxb',默認情況下無法將'UUID'從/轉換爲'String'。 '@ PathParam'工作,因爲它不是由'jaxb'處理,而是由''球衣'本身處理。但這只是[一種可能的方法](https://jersey.java.net/documentation/latest/media.html#d0e8052)來編組'JSON'數據。我不確定,但猜測'jersey'和'jaxb'之間存在一些錯誤配置。您可以嘗試切換到* afaik *能夠立即處理'UUID'的'jackson' serilalization('jersey-media-json-jackson'包)。 – vsminkov

相關問題