Jersey - 使用json - 嵌套对象序列化POJO将被忽略

时间:2013-12-15 16:24:24

标签: json jersey

HiAll,

我在开发分支中遇到以下问题: 如果我使用泽西REST服务来序列化POJO包含嵌套的其他POJO的列表,那么这个嵌套的POJO将不会被序列化。此问题仅在分支中可重现。

如果我在分支中使用POJO structur原型,我没有问题。

详情:

    The POJO (Domain): 
    public class Article {

     private int id;

    private int name;
     // getter & setter

    }

POJO(DTO)

    public class DTO {

    private List<Article> articles;

    private String message;

    public DTO {
     articles= new ArrayList<>();
    }

     getArticles() {
     return articles;
    }

     getArticlesCount() {
     return articles.size();
    }

     public void getMessage() {
     return message;
    }

    public String getMessage() {
     return message;
    }
....
   }

将创建1篇文章,其中id = 1并命名为“firstArticle” 服务调用后序列化的结果找到所有文章:

分支

中的

*{"message":"1 article found","articlesCount":1
}*
原型

中的

{
{"message":"1 article found","articlesCount":1[{"id":1,"name":"firstArticle"]}
}

我没有发生什么事。我查看了所有设置(web.xml,jersey版本等)

2 个答案:

答案 0 :(得分:0)

如果您使用Jackson JSON library,您的POJO将由Jackson JSON lib自动处理,以在JSON和POJO之间进行转换。您还需要在web.xml中添加以下行:

<init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
</init-param>

然后在Jersey资源类中,使用@Produces@Consumes注释来指示数据格式为JSON:

@Path("/myResource")
@Produces("application/json")
public class SomeResource {
    @GET
    public String doGetAsJson() {
        ...
    }
}

答案 1 :(得分:0)

按照上面的答案设置Jersey POJO mappping,然后尝试以下嵌套的POJO示例。

文章类:

public class Article {
    private int id;
    private String name;

    public Article(int id, String name) {
        this.id = id;
        this.name = name;
    }

    //getter and setter ...
}

包含Article类的Book类:

public class Book {
    private List<Article> articles;
    private String message;
    private int articleCount;

    public List<Article> getArticles() {
        return articles;
    }

    public void setArticles(List<Article> articles) {
        this.articles = articles;
        setArticleCount(articles.size());
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getArticleCount() {
        return articleCount;
    }

    public void setArticleCount(int articleCount) {
        this.articleCount = articleCount;
    }
}

最后在Jersey资源类NestedPojoResource:

@Path("/nested-pojo")
public class NestedPojoResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Book getNestedPojo() {
        Book book = new Book();
        List<Article> articles = new ArrayList<Article>();
        articles.add(new Article(1, "firstArticle"));
        articles.add(new Article(2, "secondArticle"));
        book.setArticles(articles);
        book.setMessage(book.getArticleCount() + " articles found");
        return book;
    }
}

当你转到http://example.com/myappname/nested-pojo时,你会看到包含嵌套POJO字段的正确JSON输出:

{"articles":[{"id":1,"name":"firstArticle"},{"id":2,"name":"secondArticle"}],"message":"2 articles found","articleCount":2}