DriverJson
クラスインスタンスをHTTPリクエストペイロードとして受け入れるエンドポイントがあります。 DriverJson
クラスは、タイプjava.util.UUID
のuserId
というプロパティを持っています。 問題は、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>
私はあなたのソリューションを試してみましたが、動作しますが、Jerseyがどのようにして欲しいかを知っておく必要があるときにカスタムアダプターを書く必要があるのは分かりませんそれを箱から出してみましょうか?また、JerseyがString @PathParamをUUIDにどのように非直列化できるのか理解していませんが、オブジェクトを要求するときにはできません。 – anchor
@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