gpt4 book ai didi

java - Jersey:如何将 Jackson 添加到 Servlet Holder

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:20 28 4
gpt4 key购买 nike

我正在使用 Jersey 创建嵌入式 Jetty 网络应用程序。我不知道如何在这里为自动 JSON serde 添加 Jackson:

    ServletHolder jerseyServlet = context.addServlet(
org.glassfish.jersey.servlet.ServletContainer.class, "/*");
jerseyServlet.setInitOrder(0);

jerseyServlet.setInitParameter(
ServerProperties.PROVIDER_CLASSNAMES,
StringUtils.join(
Arrays.asList(
HealthCheck.class.getCanonicalName(),
Rest.class.getCanonicalName()),
";"));

// Create JAX-RS application.
final Application application = new ResourceConfig()
.packages("com.example.application")
.register(JacksonFeature.class);

// what do I do now to tie this to the ServletHolder?

如何使用 ServletHolder 注册此 ResourceConfig,以便在使用注释 @Produces(MediaType.APPLICATION_JSON) 的地方使用 Jackson?这是嵌入式 Jetty 应用程序的完整主类

package com.example.application.web;

import com.example.application.api.HealthCheck;
import com.example.application.api.Rest;
import com.example.application.api.Frontend;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.ServerProperties;

import javax.ws.rs.core.Application;
import java.util.Arrays;

public class JettyStarter {

public static void main(String[] args) throws Exception {

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
Server jettyServer = new Server(9090);
jettyServer.setHandler(context);
ServletHolder jerseyServlet = context.addServlet(
org.glassfish.jersey.servlet.ServletContainer.class, "/*");
jerseyServlet.setInitOrder(0);

jerseyServlet.setInitParameter(
ServerProperties.PROVIDER_CLASSNAMES,
StringUtils.join(
Arrays.asList(
HealthCheck.class.getCanonicalName(),
Rest.class.getCanonicalName()),
";"));

// Create JAX-RS application.
final Application application = new ResourceConfig()
.packages("com.example.application")
.register(JacksonFeature.class);


try {
jettyServer.start();
jettyServer.join();
} catch (Exception e) {
System.out.println("Could not start server");
e.printStackTrace();
} finally {
jettyServer.destroy();
}
}
}

最佳答案

一种方法是将 ResourceConfig 包装在显式 construction 中的 ServletContainer ,如图所示 here .

用你的例子测试过

public class RestServer {

public static void main(String[] args) throws Exception {

// Create JAX-RS application.
final ResourceConfig application = new ResourceConfig()
.packages("jersey.jetty.embedded")
.register(JacksonFeature.class);

ServletContextHandler context
= new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
Server jettyServer = new Server(9090);
jettyServer.setHandler(context);
ServletHolder jerseyServlet = new ServletHolder(new
org.glassfish.jersey.servlet.ServletContainer(application));
jerseyServlet.setInitOrder(0);

context.addServlet(jerseyServlet, "/*");

// ... removed property (init-param) to compile.

try {
jettyServer.start();
jettyServer.join();
} catch (Exception e) {
System.out.println("Could not start server");
e.printStackTrace();
} finally {
jettyServer.destroy();
}
}
}

你也可以...

在不更改原始帖子中的任何其他内容的情况下,只需设置 init 参数以扫描 Jackson 提供程序包

jerseyServlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES,
"com.fasterxml.jackson.jaxrs.json;"
+ "jersey.jetty.embedded" // my package(s)
);

请注意,您尝试使用 ResourceConfig 似乎有点多余,因为您已经在 init 参数中配置了您的类。您也可以像我所做的那样摆脱显式添加每个类而只扫描整个包。

你也可以...

只需使用您需要的 Jackson 提供程序类即可。您可以查看 jar,您将看到的不仅仅是编码/解码提供程序 (Jackson[JAXB]JsonProvider),如 ExceptionMappers。您可能不喜欢这些映射器并希望配置您自己的映射器。在这种情况下,就像我说的,只包括您需要的提供者。例如

jerseyServlet.setInitParameter(ServerProperties.PROVIDER_CLASSNAMES,
"com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider");

jerseyServlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES,
"jersey.jetty.embedded" // my package(s)
);

经过进一步测试...

不确定 Jersey 的版本,但我使用的是 Jersey 2.15(带有 jersey-media-json-jackson:2.15),并且没有任何进一步的配置,只是扫描 my 包用于我的资源类,Jackson 功能已经启用。这是自动发现功能的一部分。我相信这是从 2.8 或 2.9 开始为 Jackson 功能启用的。因此,如果您使用的是较晚的版本,我认为您不需要明确配置任何内容,至少从我测试过的内容来看是这样 :-)


更新

以上所有示例都已使用以下 Maven pom.xml 进行了测试

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.underdog.jersey</groupId>
<artifactId>jersey-jetty-embedded</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<jersey.version>2.15</jersey.version>
<jetty.version>9.2.6.v20141205</jetty.version>
</properties>

<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlets</artifactId>
<version>${jetty.version}</version>
</dependency>
</dependencies>

<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>
</project>

和资源类

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/json")
public class JsonResource {

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getJson() {
Resource resource = new Resource();
resource.hello = "world";
return Response.ok(resource).build();
}

public static class Resource {
public String hello;
}
}

使用路径

http://localhost:9090/json

关于java - Jersey:如何将 Jackson 添加到 Servlet Holder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28733805/

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