- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 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/
我有一个画廊,每个元素都有 .item 类。在 .item 中总有一个删除它的链接: Title of item remove 当您按下一个 .item 时,它会显示一个红色边框 div.item:a
一 点睛 Hold 方式的单例完全是借助了类加载的特点。 二 代码 package singleton.singleton3; // final 不允许继承 public final class S
所以,这是我的项目结构。这只是一个两个选项卡的应用程序。 左侧选项卡上有所有可用项目的列表。在右侧选项卡上,有用户最喜欢的项目的列表。每个项目都有一个按钮,单击该按钮,该项目就会成为 Collecti
我正在使用 jBullet 和 OpenGL 来创建一个基本的游戏引擎。我创建了两个名为 ObjectSurface 和 ObjectEntity 的类。基本上,ObjectSurface 没有质量,
我正在开发具有自定义布局 和arrayAdapter 的应用。我的自定义布局由 1 个 ImageView、2 个 textView 和 1 个复选框组成。 Booth 的图像文件和文本存储在 val
我正在实现一个模板类“Holder”,稍后应该专门用于包含不同类的对象。 Holder 将对象存储为属性。当在构造函数中存储需要参数的对象时,holder 类在实例化时失败: #include te
我有带部分的列表,但是这个 ListView 很慢。 我需要任何支架,但我不知道怎么做。 当我只有一种 View 时很简单,但在这里我遇到了问题。 我创建了 holder,但是当 ListView 显
在我的应用程序中,我有几种holder 对象,其主要目的是存储异构相关数据。它们的生命周期可以分为两部分: 一旦可用就收集数据; 在持有人的余生中提供对存储数据的只读访问权限。 使持有者不可变是非常诱
我正在将数据上传到服务器,如果数据成功上传到服务器,那么我会显示“已保存”,就像您可以看到图像“已上传”一样。 但问题是,我已经为第一个项目行存储了数据,而在不同的行项目中获取“已保存”文本 hold
我有一个杂乱的树形多维数组,我想执行以下操作: 提取每个数组,无论嵌套多远以将其放入单个“holder 数组”,所以这(只是一个基本示例,因为就嵌套而言它会比这复杂得多) $this = array[
我有两个版本的“Initialization-on-demand holder idiom”: http://en.wikipedia.org/wiki/Initialization-on-deman
我正在开发自定义相机应用程序。下面是我的 Activity 类。 public class MyCustomCam extends Activity { private Camera mCamera;
我对 ListView 有问题,或者更准确地说 - 放置在其上的 ImageView。我的应用正在从 Youtube 下载缩略图。到那个地方的一切都很好。后来,在使用 getView() 时出现了一个
使用 CSS,如何根据下图创建部分边框 我可以获得完整的边框: border: 1px solid #f5f5f5; 但只想在垂直边框的顶部和底部显示 30px,中间没有任何东西? 这能实现吗? 一如
以下代码将 Holder 指定为 interface 类型。 可以对 Holder 对象进行哪些更改,以便它接收具有引用类型的任何类型,因此如果对值对象进行任何更改,它会反射(reflect)在 ma
我正在开发一个具有自定义布局和 arrayAdapter 的应用: 问题是当我选中一个框时,应用程序会自动选中另外2个框! 我创建了一个列表,在其中放置了复选框的位置,并表明没有任何问题!我认为问题出
我有一个非常简单的单例,它使用持有者模式(我只显示了模式,没有其他细节): public class Foo { private static class FooHolder {
我一直在尝试使用 jQuery 构建一个简单的照片库。这是我到目前为止所得到的。这工作正常,但问题是照片没有垂直居中显示在屏幕上。 这是我正在处理的片段。如果您全屏运行代码片段,图像会停留在顶部。如何
我试图理解并完成尝试创建一个类的任务,该类扩展了一个接受所有类型类的通用类。到目前为止,我有这个工作。我正在尝试创建一个扩展通用持有人类的类,并让这个类只接受特定的对象。 例如,名为“Computer
这是网络上最常见的实现方式 private static class LazySomethingHolder { public static Something something = new S
我是一名优秀的程序员,十分优秀!