我有一个端点,它接受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>
我试过你的解决方案,它的工作原理,但我不明白为什么我必须编写自定义适配器,当泽西岛应该知道如何确定把它从盒子里取出来?我也不明白Jersey如何将String @PathParam反序列化为UUID,但是当请求对象时,它不能? – anchor
@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