2013-07-09 35 views
4

我使用杰克逊json提供者与泽西岛2.0。我有这样的Web资源:杰克逊供应商不反序列化POST数据到Pojo(泽西岛2.0)

@Path("/accesstokens") 
public class AccessTokensService { 

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public Response generate(UserCredentials creds) { 

    System.out.println("In generate method.."); 
    System.out.println(creds); 
    try { 
     // Authenticate .. generate token .. 
     return Response.ok(token, MediaType.APPLICATION_JSON).build(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
     return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); 
    } 
} 
} 

的UserCredentials POJO类如下:

public class UserCredentials { 

private String username; 
private String password; 
private String ipAddress; 

public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public String getIpAddress() { 
    return ipAddress; 
} 

public void setIpAddress(String ipAddress) { 
    this.ipAddress = ipAddress; 
} 
} 

下面是web.xml中的相关片段:

<servlet> 
    <servlet-name>jersey-rest-service</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.xxxxx.apps.ws.services;com.fasterxml.jackson.jaxrs.json;com.xxxxxx.apps.servlet;com.xxxxxx.apps.ws.filters</param-value> 
    </init-param> 
    <init-param> 
     <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> 
     <param-value>com.xxxxxx.apps.ws.filters.LoggingFilter</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

这里是如何POST实体数据看起来像:

{"username":"xxxxx", "password":"xxxxxx", "ipAddress": "xxx.xxx.xxx.xxx"} 

不幸的是,杰克逊提供商并未反序列化上述JSON。一个空的UserCredentials对象被注入到上面的Web资源的POST方法中。如果我使用自定义的MessageBodyReader,则会调用Reader的readFrom方法,并且可以创建UserCredentials pojo,然后在POST方法中使用它。

几个问题:

1)我需要做的POJO的任何特殊标注为杰克逊承认它? Pojo的包是否需要添加到web.xml中?

2)web.xml中的这个属性是否相关:“com.sun.jersey.api.json.POJOMappingFeature”?

3)我需要添加一个ObjectMapper吗?我认为它只需要处理定制案例,但请告知。

3)其他陷阱?有没有办法在杰克逊调试代码?

谢谢。

回答

2

1)你不需要有任何特殊的注释

2)无POJOMappingFeature似乎不相关了

3)不,你不需要添加ObjectMapper

4)有其他任何陷阱:

写扩展javax.ws.rs.core.Application类和JacksonFeature添加到您的配置类(你必须有它在你的classpath,添加到您的Maven配置):

package com.example; 
public class YourApplication extends Application { 

    @Override 
    public final Set<Class<?>> getClasses() { 
     HashSet<Class<?>> set = new HashSet<>(1); 
     set.add(JacksonFeature.class); 
     return set; 
    } 

} 

在web.xml中添加以下参数的servlet配置下网队:

<init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.example.YourApplication</param-value> 
    </init-param> 

应该这样做。不幸的是,球衣2.0的确有点难度。

+0

嗨,jackson-jaxrs-providers artifact提供的JacksonFeature?如果是的话是否有一个maven repo托管这个或者我应该从github上下载并构建一个?谢谢 – devlearn

+0

这是在jersey-media-json-jackson。请参阅https://jersey.java.net/documentation/latest/user-guide.html#json.jackson –

+0

即使没有在应用程序中声明JacksonFeature,它也可以使用该软件包!非常感谢。 – devlearn

0

如果使用标准的杰克逊从2.X JAX-RS提供者:

https://github.com/FasterXML/jackson-jaxrs-providers

你不应该做任何事情超过中添加到classpath它;它具有应该自动注册提供者的SPI元数据。

Jackson 1。x提供者没有添加这个,因为担心它可能会干扰其他选项。 但是对于2.x,这样做似乎没有意义。

0

我想出了什么问题。我附加了一个LoggingFilter来处理请求。它从实体流中读取实体。因此,杰克逊没有什么可以阅读和处理的。傻我!