簡體   English   中英

Glassfish GET JSON Web服務500錯誤-未找到MessageBodyWriter

[英]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

ServerProperties.MOXY_JSON_FEATURE_DISABLE

我已經有一段時間沒有使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM