4

我正在使用带有 Jersey 2.0 的 Jackson json 提供程序。我有一个这样的网络资源:

@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"}

不幸的是,Jackson 提供者没有反序列化上述 JSON。将一个 null UserCredentials 对象注入到上述 Web 资源 POST 方法中。如果我使用自定义 MessageBodyReader,我的 Reader 的 readFrom 方法会被调用,我可以创建 UserCredentials pojo,然后在 POST 方法中可用。

几个问题:

1)我需要在Pojo上做任何特殊的注释让Jackson识别它吗?Pojo的包需要在web.xml中添加吗?

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

3) 我需要添加一个 ObjectMapper 吗?我认为它只需要针对自定义案例进行,但请告知。

3)还有其他问题吗?有没有办法在 Jackson 中调试代码?

谢谢。

4

3 回答 3

2

1)您不需要任何特殊注释

2)没有 POJOMappingFeature 似乎不再相关

3) 不,您不需要添加 ObjectMapper

4)是的任何其他陷阱:

编写一个扩展类javax.ws.rs.core.Application并将 JacksonFeature 添加到您配置的类中(您必须将它放在您的类路径中,添加到您的 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;
    }

}

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

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

那应该这样做。不幸的是,球衣 2.0 确实变得有点困难。

于 2013-07-10T16:32:20.053 回答
0

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

于 2013-07-11T17:06:54.937 回答
0

如果您使用来自以下位置的标准 Jackson 2.x JAX-RS 提供程序:

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

除了将它添加到类路径中之外,您不需要做任何其他事情;它具有应该自动注册提供程序的 SPI 元数据。

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

于 2013-07-11T00:33:39.630 回答