2017-04-08 73 views
0

在我的REST應用程序(GlassFish 4.1.2下)中,我想將POJO轉換爲JSON並返回。這些例子都讓它看起來很簡單,但我錯過了一些東西。MOXyJsonProvider無法正常工作

這裏是我的應用程序:

@ApplicationPath("/") 
public class RootApp extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     HashSet set = new HashSet<Class<?>>(); 
     set.add(HelloWorld.class); 
     return set; 
    } 

    @Override 
    public Set<Object> getSingletons() { 
     HashSet set = new HashSet<Object>(); 

     MOXyJsonProvider moxyJsonProvider = new MOXyJsonProvider(); 
     moxyJsonProvider.setFormattedOutput(true); 
     set.add(moxyJsonProvider); 

     return set; 
    } 
} 

這裏是資源:

@Path("helloworld") 
public class HelloWorld { 

    private static int counter = 1; 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getInevitableMessage() {  
     JsonHello hj = new JsonHello("Hello World", counter++);  
     return Response.ok(hj).build(); 
    }  
} 

而且最後也是最不重要的是轉換爲從JSON的POJO:

public class JsonHello { 

    private int count; 
    private String message; 

    public JsonHello(String message, int count) { 
     this.message = message; 
     this.count = count; 
    } 

    public int count() { return count; } 
    public void count(int value) { count = value; } 

    public String message() { return message; } 
    public void message(String value) { message = value; } 
} 

我指的是thread中的標記答案。當我試圖訪問「/ HelloWorld」的它間距以下異常:

org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.persistence.jaxb.BeanValidationHelper 

此應用程序,如果資源只是返回一個字符串。 web.xml文件中沒有任何內容,因爲我讓Glassfish通過它的裝飾器設置應用程序。

任何想法我在這裏失蹤?

+0

你是如何處理依賴關係的? Maven的?如果是這樣,你使用什麼依賴關係?手動添加罐子?如果是這樣,你使用什麼罐子?你使用什麼版本?你使用的是什麼版本的Glassfish?請回答以上每個問題,並編輯您的帖子(不在評論中) –

+0

@peeskillet該項目由Idea 2017.1生成,並使用GlassFish 4.1.2。它使用IDE的構建系統 - 不是Ant或Maven。這些庫是手動導入的,我使用的是Jackson 2.8.4。我不知道如何告訴IDE一個庫是「提供的」(即已經是GlassFish的一部分),而不是與應用程序打包在一起,這可能是一個問題。 – AlanObject

+0

如果您使用的是傑克遜,那麼您爲什麼要註冊MOXY? –

回答

0

我最終用@peeskillet建議的方向解決了這個問題。 MOXyJsonProvider不需要。

一個難以解決的問題是,幾乎所有網絡上的例子都假設你正在配置你的Servlet,其中包含一個web.xml文件,我不是。我所做的所有配置都是從應用程序對象中提取的。澤西島文件沒有說明這一點。是什麼最終的工作是這樣的:

@Override 
public Set<Class<?>> getClasses() { 
    HashSet set = new HashSet<Class<?>>(); 
    set.add(JacksonFeature.class); 
    set.add(MyObjectMapperProvider.class); 
    set.add(Home.class); 
    set.add(HelloWorld.class); 
    return set; 
} 

此時REST資源可以生產和消費被轉碼成JSON完美,沒有任何努力的各種的POJO。

我不會僅僅刪除這個問題,而是將這個答案放在這裏,希望能夠節省一些人花費的時間。