Java 为不同的Jersey REST服务调用应用不同的Jackson筛选器

Java 为不同的Jersey REST服务调用应用不同的Jackson筛选器,java,jersey,jax-rs,jackson,Java,Jersey,Jax Rs,Jackson,我正在使用Jersey实现JAX-RSREST样式的服务,以及用于JSON映射的Jackson 2.0.2。其中一个REST服务返回一个List(我们称之为indexA),其中EntityA包含另一个List,而另一个服务只返回一个List(我们称之为indexB): @实体 @JsonAutoDetect 公共类实体{ @身份证 私有字符串id; @独身癖 私人名单b; ... } @实体 @JsonAutoDetect @JsonFilter(“bFilter”) 公共类实体B{ @身份证

我正在使用Jersey实现JAX-RSREST样式的服务,以及用于JSON映射的Jackson 2.0.2。其中一个REST服务返回一个
List
(我们称之为
indexA
),其中
EntityA
包含另一个
List
,而另一个服务只返回一个
List
(我们称之为
indexB
):

@实体
@JsonAutoDetect
公共类实体{
@身份证
私有字符串id;
@独身癖
私人名单b;
...
}
@实体
@JsonAutoDetect
@JsonFilter(“bFilter”)
公共类实体B{
@身份证
私有字符串id;
私人串一些;
私人字符串其他;
私有字符串属性;
...
}
@路径(“/a”)
公共类资源{
@得到
@路径(“/”)
公共列表索引(){
...
}
}
@路径(“/b”)
公共类资源{
@得到
@路径(“/”)
公共列表indexB(){
...
}
}
我想要实现的是对
indexA
调用应用Jackson过滤器,以便不是子
EntityB
元素的所有属性都被序列化。OTOH,
indexB
应完整返回
EntityB

我知道存在一个
ContextResolver
,我已经将其用于其他目的。不幸的是,对于
ContextResolver
来说,由于
ContextResolver提供的
Class
,似乎无法区分这两种服务调用。在这两种情况下,getContext(Class)
都是
ArrayList
(由于类型擦除,我无法找出泛型类型参数)

根据要映射的实体类型,是否有任何钩子更适合配置
ObjectMapper
/
FilterProvider


我可以使用中提出的方法:手动映射到
字符串
,但这扼杀了基于声明性注释的方法的全部优点,因此我想避免这种情况。

我也遇到过同样的情况,经过大量的研究,我找到了答案,解决方案是使用
@JsonView
和Spring,它可以将
ObjectMapper
注入JSON编写器,而不会破坏Jersey的美丽

我正在开发一组REST API,我想获得
SystemObject
的实例列表和
SystemObject
的特定实例的详细信息,就像你一样,我只想列表中每个实例的属性数量非常有限,详细信息中还有一些附加属性,我只是为它们定义视图,并在
SystemObject
类中添加注释。但是默认情况下,所有没有
@JsonView
注释的属性都将输出到JSON,但是有一个配置
项(SerializationConfig.Feature.default\u VIEW\u INCLUSION)
我可以用来排除它们

问题是我必须将其设置为真以满足我的需要。但是我不能改变ObjectMapper,它具有将对象转换为JSON的神奇功能,通过阅读下面的3篇文章,我认为我唯一能做的就是将修改后的
ObjectMapper
注入Jersey。 现在我得到了我想要的

这就像针对数据库表创建多个视图一样

这3个链接将以不同的方式帮助您:

休息资源:

package com.john.rest.resource;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.UriInfo;

import org.codehaus.jackson.map.annotate.JsonView;
import org.springframework.stereotype.Component;

import com.midtronics.esp.common.EspException;
import com.midtronics.esp.common.SystemObject;
import com.midtronics.esp.mobile.model.SystemObjectView;
import com.midtronics.esp.model.accesscontrol.AccessControlBean;
import com.midtronics.esp.model.site.SiteBean;

@Component
@Path("/hierarchy")
public class Hierarchy {

    // Allows to insert contextual objects into the class, 
    // e.g. ServletContext, Request, Response, UriInfo
    @Context
    UriInfo uriInfo;

    @Context
    Request request;

    // Return the list of sites
    @GET
    @Path("sites")
    @Produces(MediaType.APPLICATION_JSON)
    @JsonView({SystemObjectView.ObjectList.class})
    public List<SystemObject> listSite(
            @HeaderParam("userId") String userId, 
            @HeaderParam("password") String password) {
        ArrayList<SystemObject> sites= new ArrayList<SystemObject>();

        try{
            if(!AccessControlBean.CheckUser(userId, password)){
                throw new WebApplicationException(401);
            }
            SystemObject.GetSiteListByPage(sites, 2, 3);

            return sites;
        } catch(EspException e){
            throw new WebApplicationException(401);
        } catch (Exception e) {
            throw new WebApplicationException(500);
        }
    }

    // Return the number of sites
    @GET
    @Path("sites/total")
    @Produces(MediaType.TEXT_PLAIN)
    public String getSiteNumber(@HeaderParam("userId") String userId, 
            @HeaderParam("password") String password) {
        try{
            return Integer.toString(SiteBean.GetSiteTotal()); 
        } catch(EspException e){
            throw new WebApplicationException(401);
        } catch (Exception e) {
            throw new WebApplicationException(500);
        }
    }

}
REST模型视图:

package com.john.rest.model;

public class SystemObjectView {
    public static class ObjectList { };

    public static class ObjectDetail extends ObjectList { }
}

如果我能投20票,我会的。在阅读本文之前,我不知道您可以将JsonView应用于Jersey资源方法来选择要序列化的视图。如果文档中描述了这一点,我就完全错过了。顺便说一句——在没有Spring的情况下工作(我使用的是Felix)。多谢!我不认为你在文件里漏掉了这个。我一直在寻找一种很好的方法来实现这一点,直到看到这篇文章,我才找到一种。多亏有了报道,project README现在包含了适用于JAX-RS端点的注释的简要描述——希望其他容器(Spring、Restlet)也有/添加了类似的内容。
package com.john.rest.model;

import java.io.Serializable;
import java.util.ArrayList;

import javax.xml.bind.annotation.XmlRootElement;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.annotate.JsonView;

import com.midtronics.esp.mobile.model.SystemObjectView;
import com.midtronics.esp.model.common.ICommonDAO;

@XmlRootElement
public class SystemObject implements Serializable
{
    private static final long serialVersionUID = 3989499187492868996L;

    @JsonProperty("id")
    @JsonView({SystemObjectView.ObjectList.class, SystemObjectView.ObjectDetail.class})
    protected String objectID = "";

    @JsonProperty("parentId")
    protected String parentID = "";

    @JsonProperty("name")
    @JsonView({SystemObjectView.ObjectList.class, SystemObjectView.ObjectDetail.class})
    protected String objectName = "";

    //getters...
    //setters...

}
package com.john.rest.model;

public class SystemObjectView {
    public static class ObjectList { };

    public static class ObjectDetail extends ObjectList { }
}