![](/img/trans.png)
[英]jackson web service error MessageBodyWriter not found for media type=application/json
[英]Glassfish GET JSON web service 500 error - MessageBodyWriter not found
我正进入(状态
找不到针对媒体type = application / json,type = class java.util.HashMap $ Values,genericType = java.util.Collection的MessageBodyWriter
使用Glassfish 4.1从Web服务中获取。 我看到的所有内容都说在类路径中有jackson或其他库,以便可以转换类型。 使用Glassfish,我有:
~/apps/glassfish-4.1/glassfish/domains/domain1/logs$ find ../../../../ | grep jackson
../../../../glassfish/modules/jackson-core.jar
../../../../glassfish/modules/jackson-annotations.jar
../../../../glassfish/modules/jackson-databind.jar
../../../../glassfish/modules/jackson-jaxrs-json-provider.jar
../../../../glassfish/modules/jackson-jaxrs-base.jar
../../../../glassfish/modules/jersey-media-json-jackson.jar
实体类别:
public class Actor extends AbstractBaseEntity{
public Actor(String id, String name) {
super(id, name);
}
}
public class AbstractBaseEntity {
String identifier;
String name;
public AbstractBaseEntity(String id, String name){
this.identifier = id;
this.name = name;
}
public String getIdentifier() {
return identifier;
}
public String getName() {
return name;
}
}
服务等级:
@Path("actors")
public class MockActorService {
private static final int DEFAULT_COUNT = 5;
HashMap<String, Actor> items;
public MockActorService() throws WFlowServiceException {
this(MockActorService.DEFAULT_COUNT);
}
public MockActorService(int actors) throws WFlowServiceException {
items = new HashMap<>();
for (int i = 0; i < actors; i++) {
Actor a = new Actor("ID:" + i, "Actor Name " + i);
items.put(a.getIdentifier(), a);
}
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getAll() throws WFlowServiceException {
GenericEntity< Collection< Actor > > entity;
Collection<Actor> vals = items.values();
entity = new GenericEntity<Collection<Actor>>(vals){};
return Response.ok(entity).build();
}
}
为什么我仍然收到此错误?
是的,Glassfish有Jackson,但也有MOXy ,这是默认提供程序。 MOXy对于某些类型很奇怪。 如果要禁用MOXy以便可以使用Jackson,则需要将以下属性设置为true
我已经有一段时间没有使用Glassfish了,所以我不确定您是否仍然需要注册Jackson,但是我敢肯定您不需要。 它应该被自动注册。 MOXy基本上阻止了它的注册。
好的,经过一番挖掘,我提出了以下解决方案。 @peeskillet部分正确,此修复程序特定于Glassfish。
这是修复它的原因。 我需要实现以下2类:
public class JacksonFeature implements Feature {
Logger L = LoggerFactory.getLogger(JacksonFeature.class);
@Override
public boolean configure(final FeatureContext context) {
String postfix = "";
postfix = '.' + context.getConfiguration().getRuntimeType().name().toLowerCase();
context.property(CommonProperties.MOXY_JSON_FEATURE_DISABLE + postfix, true);
L.info("Set property to true disable MOXY: " + CommonProperties.MOXY_JSON_FEATURE_DISABLE + postfix);
context.register(JsonParseExceptionMapper.class);
context.register(JsonMappingExceptionMapper.class);
context.register(JacksonJsonProvider.class, MessageBodyReader.class, MessageBodyWriter.class);
return true;
}
}
@javax.ws.rs.ApplicationPath("api")
public classMyResourceConfig extends ResourceConfig {
publicMyServicesResourceConfig() {
register( new GZipEncoder() );
register( JacksonFeature.class );
addMyResources();
}
private void addMyResources() {
register( Service1.class );
register( Service2.class );
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.