2016-09-06 84 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

相关问题