gpt4 book ai didi

java - Jackson Serializer 未调用 Jersey Jax-RS

转载 作者:行者123 更新时间:2023-12-02 13:34:13 25 4
gpt4 key购买 nike

开发 JAX-RS 应用程序并解决问题。需要从我的资源自定义 json 输出,因此将 Jersey(2.22.2) 配置为使用 Jackson(2.5) 解析器而不是默认 Moxy(根据 this answer )。

这是 pom.xml 片段

        <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jersey-bom</artifactId>
<version>${jersey.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<!-- use the following artifactId if you don't need servlet 2.x compatibility -->
<!-- artifactId>jersey-container-servlet</artifactId -->
</dependency>

<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
</dependencies>
<properties>
<jersey.version>2.22.2</jersey.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

我还配置了 web.xml 文件以默认使用 Jackson

    <init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
com.mycompany.myresourcepackage
com.fasterxml.jackson.jaxrs
</param-value>
</init-param>

但是资源输出与我使用注释和序列化器配置的不同。这是表示为 json 的模型

    @XmlRootElement(name = "geo")
public class Geometry {
public Geometry() {
coordinates = new ArrayList<List<Double>>();
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

@JsonSerialize(using = CoordinatesSerializer.class)
public List<List<Double>> getCoordinates() {
return coordinates;
}

public void setCoordinates( List<List<Double>> coordinates) {
this.coordinates = coordinates;
}

@JsonProperty("tp")
private String type;
private List<List<Double>> coordinates;
}

和序列化器

protected CoordinatesSerializer(Class<List<List<Double>>> t) { }

private static final long serialVersionUID = 1L;

@Override
public void serialize(List<List<Double>> value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonGenerationException {
try {
jgen.writeArrayFieldStart("motherfucking-coordinates");

int coordinates_size = value.size();
for (int i = 0; i < coordinates_size; i++) {
jgen.writeStartArray();
jgen.writeNumber(value.get(i).get(0));
jgen.writeNumber(value.get(i).get(1));
jgen.writeEndArray();
}

jgen.writeEndArray();
}
catch (Exception e) {
e.printStackTrace();
}
}

}

这是资源片段

 @GET
@Path("/route/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Geometry(@PathParam("id") int id) {
// construct and return object
}

响应 json 根本没有自定义。

{"geometry":{"coordinates":["27.56 53.9","27.58 53.88","27.55 53.94"],"type":"LineString"},"id":"1","type":"Feature"}

期望的输出是

{"geometry":{"coordinates":[[27.56, 53.9],[27.58, 53.88],[27.55, 53.94]],"type":"LineString"},"id":"1","type":"Feature"}

非常感谢。

最佳答案

我终于设法将 Jersey 项目配置为使用 Jackson JSON 解析器而不是 Moxy(默认)。该应用程序正在 Glassfish JEE 服务器上运行。

Maven 依赖

    <dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<!-- use the following artifactId if you don't need servlet 2.x compatibility -->
<!-- artifactId>jersey-container-servlet</artifactId -->
<version>${jersey.version}</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>

您需要使用扩展 org.glassfish.jersey.server.ResourceConfig 创建类。该类的对象是在应用程序首次加载时创建的。

public class MyApplication extends ResourceConfig {
public MyApplication() {
// create custom ObjectMapper
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);

// create JsonProvider to provide custom ObjectMapper
JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(mapper);

register(provider);
register(JacksonFeature.class);
packages("your.resources.package");
}
}

创建的 MyApplication 类应该在 web.xml 文件中注册(要实际创建)。编辑 web.xml 部分。

<servlet>
<servlet-name>App</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>your.app.package.MyApplication</param-value>

</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

列出的步骤足以将 Jackson JSON 解析器注册为 Jersey Jax-RS 应用程序的默认解析器。

关于java - Jackson Serializer 未调用 Jersey Jax-RS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43091992/

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