Java Jersey 2.17:如何避免Jersey服务器中的MessageBodyWriter错误?
我正在尝试编写一个简单的Jersey服务器应用程序。我的代码只有在使用XML时才能正常工作。但当我在JSON中请求结果时,我得到以下错误:Java Jersey 2.17:如何避免Jersey服务器中的MessageBodyWriter错误?,java,json,jersey,jax-rs,Java,Json,Jersey,Jax Rs,我正在尝试编写一个简单的Jersey服务器应用程序。我的代码只有在使用XML时才能正常工作。但当我在JSON中请求结果时,我得到以下错误: org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo MessageBodyWriter not found for media type={application/json, q=1000}, type=
org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo MessageBodyWriter not found for media type={application/json, q=1000}, type=class il.zukermandl.jersey.demo.model.User, genericType=class il.zukermandl.jersey.demo.model.User.
这是我的简单Java代码
@Path("/users")
public class UserService {
@GET
@Produces({APPLICATION_JSON, APPLICATION_XML})
public Response getUser() {
return ok(new User()).build();
}
}
我对实体使用JAXB注释
@XmlRootElement(name = "user")
@XmlType(propOrder = {"id", "name", "age"})
public class User {
private Long id;
private String name;
private Integer age;
// getters,setters and ctrs were omitted
}
我的配置类
public class AppConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> resources = new HashSet<Class<?>>();
resources.add(il.zukermandl.jersey.demo.service.UserService.class);
return resources;
}
}
我认为主要问题在我的pom.xml
文件中。就是这样
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.17</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.17</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.3.2</version>
</dependency>
</dependencies>
为了防止其他人遇到同样的问题,我通过添加
shadowJar {
mergeServiceFiles()
}
到
build.gradle
。看起来插件id“com.github.johnrengelman.shadow”版本“4.0.3”
在没有它的情况下进行了错误的阴影处理。是的,我无法重现这个问题。你提供的东西对我来说很好。但是有一件事需要提到的是它没有使用的AppConfig
类。这不是问题,因为您已经在扫描包了。此外,Jackson提供程序应该是自动发现的,因此需要配置任何内容。我不明白为什么不会,但我会在将其部署到Tomcat时检查jersey media json jackson
jar是否在webapp的库中。这是我能看到它不起作用的唯一方法,而您对pom.xml
的担心也不是问题。我唯一要解决的是去掉所有Jackson依赖项,除了jersey media json Jackson
。泽西岛的媒体依赖性已经吸引了他们。同样,这不是问题,只是要彻底:-)您可以尝试显式注册JacksonFeature,看看会发生什么。将init参数添加到jersey serlvetjersey.config.server.provider.classnames
-valueorg.glassfish.jersey.jackson.JacksonFeature
当我将类名添加到web.xml
时,我收到错误:30-Mar-2015 21:24:53.827严重[http-nio-7777-exec-7]null MessageBodyWriter找不到媒体类型={application/json,q=1000},type=class-il.zukermandl.jersey.demo.model.User,genericType=class-il.zukermandl.jersey.demo.model.User.
这是同样的错误。就像我说的,我无法重现这个问题。这就是你当前项目中的所有内容吗?上面的内容。因为只要有了所有内容,它就可以正常工作。
WEB-INF
├── classes
│ ├── il
│ │ └── zukermandl
│ │ └── jersey
│ │ └── demo
│ │ ├── AppConfig.class
│ │ ├── model
│ │ │ └── User.class
│ │ └── service
│ │ └── UserService.class
│ └── misc.txt
├── lib
│ ├── aopalliance-repackaged-2.4.0-b10.jar
│ ├── hk2-api-2.4.0-b10.jar
│ ├── hk2-locator-2.4.0-b10.jar
│ ├── hk2-utils-2.4.0-b10.jar
│ ├── javassist-3.18.1-GA.jar
│ ├── javax.annotation-api-1.2.jar
│ ├── javax.inject-2.4.0-b10.jar
│ ├── javax.ws.rs-api-2.0.1.jar
│ ├── jersey-client-2.17.jar
│ ├── jersey-common-2.17.jar
│ ├── jersey-container-servlet-2.17.jar
│ ├── jersey-container-servlet-core-2.17.jar
│ ├── jersey-guava-2.17.jar
│ ├── jersey-media-jaxb-2.17.jar
│ ├── jersey-server-2.17.jar
│ ├── osgi-resource-locator-1.0.1.jar
│ └── validation-api-1.1.0.Final.jar
└── web.xml
shadowJar {
mergeServiceFiles()
}