2013-07-09 63 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來處理請求。它從實體流中讀取實體。因此,傑克遜沒有什麼可以閱讀和處理的。傻我!