每次我尝试调用REST服务时,都会收到以下错误消息
[2016-09-01T16:27:37.782+0200] [Payara 4.1] [SEVERE] [] [org.glassfish.jersey.message.internal.WriterInterceptorExecutor] [tid: _ThreadID=28 _ThreadName=http-listener-1(3)] [timeMillis: 1472740057782] [levelValue: 1000] [[MessageBodyWriter not found for media type=application/json, type=class xxx.JsonClass, genericType=class xxx.JsonClass.]]
以下是REST服务(剥离到相关部分):
import javax.ejb.EJB;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
@Path("/service")
public class Service {
@GET
@Path("/callme")
@Produces(MediaType.APPLICATION_JSON)
public JsonClass callme(//
@QueryParam("test") final String test, //
....) {
return new JsonClass();
}
}
JSON类
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
public class JsonClass {
private String test;
public JsonClass(final String test....) {
...
}
@JsonProperty
public String getTest() {
return this.test;
}
}
波姆。xml(有趣的部分)
<!-- DO NOT change the scope for jersey: https://java.net/jira/browse/JERSEY-1941 -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.8</version>
<scope>provided</scope>
</dependency>
我的设置是:
这就是我迄今为止所尝试的:
我仍然认为这是一个依赖问题。但是我不知道会有什么问题。
不幸的是,我上一篇帖子被标记为重复,尽管问题和解决方案不同。因此,我发布了一个新的问题和两个解决方案,希望能帮助你避免几个小时在桌子上磕头。
首选解决方案:
显然,GF4附带了我不想使用的MoxyJson。要集成您自己的依赖项(在我的例子中是Jackson),您需要使用以下代码禁用MoxyJson。
@ApplicationPath("/")
public class ApplicationConfig extends Application {
/**
* {@inheritDoc}
*/
@Override
public Map<String, Object> getProperties() {
final Map<String, Object> properties = new HashMap<String, Object>();
properties.put("jersey.config.server.disableMoxyJson", true);
return properties;
}
}
然后添加您自己的依赖项,例如,在我的例子中,只有这两个依赖项,因为其他依赖项被我使用的另一个库引用。
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.6.2</version>
</dependency>
最后,我犯了一个错误,没有为@JsonProperty注释设置一个值,这将导致无MessageBodyWriter发现异常。要避免这种情况,请使用以下与类相关的getter。
@JsonProperty("randomName")
public String getRandomName(){
...
}
备选方案:
更糟糕的是,在使用GF的ResourceConfig时,您需要禁用MoxyJson,单独注册每个服务,并修复一个错误。
@ApplicationPath("/")
public class ApplicationConfig extends ResourceConfig {
/**
* The default constructor.
*/
public ApplicationConfig() {
// Disable Moxy and use Jackson
this.property(ServerProperties.MOXY_JSON_FEATURE_DISABLE, true);
// Register own provider classes
this.register(Fully.Qualified.Path.To.Your.Service.class);
// Register Jackson provider
// Workaround for GF4.1 bug for details: https://java.net/jira/browse/GLASSFISH-21141
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JaxbAnnotationModule());
this.register(new JacksonJaxbJsonProvider(mapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS));
}
}
ResourceConfig类需要一个额外的依赖项。
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.main.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>4.1.1</version>
<scope>provided</scope>
</dependency>
最后,与上面相同——请注意将@JsonProperty与一个设定值一起使用。
设置看起来很简单,但它不起作用,除了以下例外: 我一直无法弄清楚我错过了什么(我已经经历了许多建议的答案,但都无济于事),可以使用另一套眼睛/视角。
我试图使用Jersey创建一个非常简单的REST服务。这是服务代码 当我通过Postman运行它时,它会返回一个XML响应 现在,我想要返回一个JSON响应。因此,我将mediatype更改为:
我正在使用JAX RS 2创建Rest客户端。客户端可以工作,但只有在我的IDE(IntellIJ IDEA)中,当我用Maven构建它时,使用Maven汇编插件并运行jar,它就不再工作了。 我收到的MessageBodyWriter找不到媒体类型=应用程序/json错误。 我尝试过添加其他帖子中建议的更多依赖项,但我不认为依赖项是一个问题,因为它在IDE中运行。 下面是引发异常的代码 调试后,
我知道有这么多关于这个的问题...但是它们不适合我,我尝试在eclipse中重新安装maven(因为创建一个新的maven项目或转换一个现有的动态web项目给我的pom.xml错误),但它一直说已经安装了...所以我质疑这样一个事实,即不使用maven就可以从rest web服务获得json吗?我已经从ws中获得了string/xml/html,现在我创建了一个新类,如下所示: 我还引用了这些库:
让我预先感谢你的帮助! 我在一个spring boot应用程序中有一个奇怪的行为。我来给你解释一下: 我正在用一些不错的rest-json服务包装一些遗留的Web服务(自定义xml消息)(通过spring-mvc和Spring boots并使用jackson序列化东西) 为了与遗留系统通信,我创建了一个自定义XmlMapper、序列化器和反序列化器。 最后,我创建了一个httpclientconf
我在使用JAX-RS服务作为JSON时遇到了一些问题。