2016-09-06 4 views
1

DriverJsonクラスインスタンスをHTTPリクエストペイロードとして受け入れるエンドポイントがあります。 DriverJsonクラスは、タイプjava.util.UUIDuserIdというプロパティを持っています。 問題は、UUID文字列をUUIDオブジェクトに逆シリアル化できないことです。 driverJsonをデバッグして検査すると、userId1プロパティはnullです(幸いにも例外は発生しません)。私は、fromString(String string)メソッド(java.util.UUIDがある)または1つのコンストラクタ(String)を持つクラスがJerseyによって自動的に(デシリアライザクラスを追加しなくても)デシリアライズされることを説明するこの記事(article)を読んでいます。 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(); 
} 

マイドライバー・クラス:

@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" 
} 

私が使用しています標準ジャージーアーチ次の依存関係を持つETYPE(バージョン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

カスタム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がどのようにして欲しいかを知っておく必要があるときにカスタムアダプターを書く必要があるのは分かりませんそれを箱から出してみましょうか?また、JerseyがString @PathParamをUUIDにどのように非直列化できるのか理解していませんが、オブジェクトを要求するときにはできません。 – anchor

+0

@anchor私の解決策はデフォルトで 'UUID'を' String'と/ 'String'に変換できない' jaxb'に当てはまります。 '@ PathParam'は' jaxb'によって処理されず 'jersey'自体によって処理されるので動作します。しかしこれは 'JSON'データをマーシャリングするための1つの方法です(https://jersey.java.net/documentation/latest/media.html#d0e8052)。私は確信していないが、 'ジャージ'と 'jaxb'の間に何らかの設定ミスがあると推測する。 * afaik *がすぐに 'UUID'を扱うことができる' jackson' serilalization( 'jersey-media-json-jackson'パッケージ)に切り替えることができます。 – vsminkov

関連する問題