我正在使用Jersey创建一个嵌入式Jetty webapp。我不知道如何在这里添加杰克逊自动JSON serde:
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)
的地方使用?这是嵌入式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();
}
}
}
答案 0 :(得分:10)
一种方法是将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
),并且没有任何进一步的配置,只需扫描我的包中的资源类,Jackson功能已启用。这是自动发现功能的一部分。我相信这是杰克逊功能的2.8或2.9。因此,如果您使用的是后者,我认为您不需要明确配置任何内容,至少从我测试的内容开始: - )
所有上述示例均已使用以下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