gpt4 book ai didi

post - Jackson 提供者未将 POST 数据反序列化为 Pojo (Jersey 2.0)

转载 作者:行者123 更新时间:2023-12-04 11:46:55 25 4
gpt4 key购买 nike

我正在使用带有 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 对象注入(inject)到上述 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 中调试代码?

谢谢。

最佳答案

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>

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

关于post - Jackson 提供者未将 POST 数据反序列化为 Pojo (Jersey 2.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17538515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com