【问题标题】:Jackson provider not deserializing POST data into Pojo (Jersey 2.0)Jackson 提供者未将 POST 数据反序列化为 Pojo (Jersey 2.0)
【发布时间】:2013-07-06 11:40:34
【问题描述】:

我正在使用带有 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 的相关 sn-p:

<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 中调试代码?

谢谢。

【问题讨论】:

    标签: post jersey jackson deserialization pojo


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        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 确实变得有点困难。

        【讨论】:

        • 嗨,jackson-jaxrs-providers 工件提供的 JacksonFeature 是什么?如果是这样,是否有一个托管这个的 maven 存储库,或者我应该从 github 下载并构建一个?谢谢
        • 它在 jersey-media-json-jackson 中。见jersey.java.net/documentation/latest/…
        • 即使没有在应用程序中声明 JacksonFeature,它也适用于这个包!非常感谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-08
        • 2014-10-22
        • 2012-04-07
        相关资源
        最近更新 更多