【问题标题】:Glassfish GET JSON web service 500 error - MessageBodyWriter not foundGlassfish GET JSON Web 服务 500 错误 - 找不到 MessageBodyWriter
【发布时间】:2016-04-26 15:46:19
【问题描述】:

我来了

找不到媒体 type=application/json、type=class java.util.HashMap$Values、genericType=java.util.Collection 的 MessageBodyWriter

来自 Glassfish 4.1 的网络服务。我看到的一切都说在类路径中有杰克逊或其他库,以便可以转换类型。使用 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();
    }
}

为什么我仍然收到此错误?

【问题讨论】:

    标签: java json glassfish jersey-2.0


    【解决方案1】:

    是的,Glassfish 有 Jackson,但它也有 MOXy,这是默认提供程序。 MOXy 对于某些类型很奇怪。如果要禁用 MOXy 以便可以使用 Jackson,则需要将以下属性设置为 true

    ServerProperties.MOXY_JSON_FEATURE_DISABLE

    我有一段时间没有使用 Glassfish,所以我不确定您是否还需要注册 Jackson,但我很确定您不需要。它应该是自动注册的。 MOXy 基本上会阻止它被注册。

    【讨论】:

    • 我在哪里设置这个属性?我在 glassfish 下的所有文件中查找了 ServerProperties,但看不到在哪里设置?
    • 如果您只使用标准的 JAX-RS API,那么您可以只使用属性的字符串版本。点击链接查看。您可以通过覆盖Map&lt;String, Object&gt; getProperties() 来配置应用程序子类中的属性。或者在你的 web.xml 中只使用一个 init-param。
    • 否则,如果您有 Jersey 依赖项,并且您正在使用 ResourceConfig 子类,则可以在子类构造函数中调用 property(key, value)。如需更多帮助,我需要了解有关您的设置的更多信息。
    【解决方案2】:

    好的,经过一番挖掘,我想出了以下方法来修复它。 @peeskillet 部分正确,这个修复是 Glassfish 特有的。

    Here is the blog with more context

    这是修复它的方法。我需要实现以下 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 );
        }
    }
    

    【讨论】:

    • 正如我在上一条评论中提到的那样,您只需详细说明您的设置,就可以让您的生活更轻松。我不想发布所有可能毫无意义的方式。在您的帖子中,您这里有一些不需要的东西,例如,因为 jersey-media-json-jackson 依赖项中已经有一个 JacksonFeature,您可以注册它。如果您想保留修复标准 JAX-RS,我也可以为您提供帮助。但我不知道你是如何构建你的应用程序的。泽西附近?围绕标准 JAX-RS? web.xml? Java配置?等等。这就是我所说的“设置”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 2017-06-10
    • 2012-05-05
    • 1970-01-01
    • 2015-03-24
    相关资源
    最近更新 更多