我正在与Grizzly,Jersey和Jackson一起使用REST应用程序,因为Jersey忽略了我的自定义ObjectMapper.
POM依赖:
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-servlet</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.1.4</version>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
结果版本是:Grizzly 2.3.3,Jackson 2.1.4和Jersey 2.2.
主类(我希望明确注册Jersey组件):
public class Main {
public static void main(String[] args) {
try {
ResourceConfig rc = new ResourceConfig();
rc.register(ExampleResource.class);
rc.register(ObjectMapperResolver.class);
HttpHandler handler = ContainerFactory.createContainer(
GrizzlyHttpContainer.class, rc);
URI uri = new URI("http://0.0.0.0:8080/");
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri);
ServerConfiguration config = server.getServerConfiguration();
config.addHttpHandler(handler, "/");
server.start();
System.in.read();
} catch (ProcessingException | URISyntaxException | IOException e) {
throw new Error("Unable to create HTTP server.", e);
}
} …Run Code Online (Sandbox Code Playgroud) 我正在使用Jersey 2.4创建一个简单的REST接口来提供JSON对象.我的问题是我正在尝试使用fastxml Jackson注释来控制输出,这对我不起作用.我已将注释放入我的bean类中,但它们被忽略了.
当我显式创建一个ObjectMapper并使用它来对Java bean进行字符串化时,我得到了我想要的输出,它尊重了Jackson注释.但是,我更希望我不必执行此步骤,以便我的资源类可以简单地返回bean,并且Jersey框架负责对其进行字符串化.
我试图使用Custom ObjectMapper与Jersey 2.2和Jackson 2.1的答案解决这个问题,但是,这似乎对我没有用.我看到ContextResolver已创建,但从未调用过.
我也花了很多时间试图解决这个看似简单的问题.我已将其删除为一个非常简单的测试用例,如下所示.我很感激任何帮助解决这个问题.
资源Java类:
@Path("resource")
public class MainResource {
public static class Foobar {
@JsonIgnore
private String foo = "foo";
private String baa = "baa";
private Map<String, List<? extends Number>> map = new HashMap<>();
public Foobar() {
map.put("even", Arrays.asList(new Integer[] { 2, 4, 6, 8, 10 }));
map.put("odd", Arrays.asList(new Integer[] { 1, 3, 5, 7, 9 }));
map.put("float", Arrays.asList(new Float[] { 1.1F, 2.2F, 3.3F }));
}
public String getFoo() {
return …Run Code Online (Sandbox Code Playgroud) 我使用org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder以下面的方式构建REST客户端:
ResteasyClient client = (new ResteasyClientBuilder())
.maxPooledPerRoute(5)
.connectionPoolSize(10)
.socketTimeout(10L, TimeUnit.SECONDS)
.register(jacksonProvider)
.register(new RestClientLogger())
.register(new RestClientMDCFilter())
.build();
Run Code Online (Sandbox Code Playgroud)
在jacksonProvider那里注册的是一个ResteasyJackson2Provider jacksonProvider = new ResteasyJackson2Provider();带有ObjectMapper对反序列化很重要的自定义.到目前为止,问题是,我在JBoss中得到以下警告:
10:31:38,414 WARN [org.jboss.resteasy.resteasy_jaxrs.i18n] (default-threads - 1) RESTEASY002155: Provider class org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider is already registered. 2nd registration is being ignored.
Run Code Online (Sandbox Code Playgroud)
如果在已经存在之前已注册的同一类的实例的情况下检查文档,这是有意义的.我使用反编译器来检查ResteasyClientBuilder正在做什么并且能够看到,它扫描类路径以查找包含描述应该注册"内置"提供程序的资源的jar.
其中一个jboss提供的实现现在显然已经定义了一个ResteasyJackson2Provider在那里注册的实现,这使我以后无法注册我自己的实例.
我有什么选择?我需要得到我的版本ResteasyJackson2Provider- 或者至少是我的版本ObjectMapper.我可以以某种方式取代现有的吗?