集合和jax-rs

时间:2013-03-01 13:30:47

标签: java jackson jax-rs

假设我有一个集合,/ cars,支持常规操作,我也支持/ cars / {id}。

当我获得GET for / cars时,仅返回集合元素的有限“视图”的最佳做法是什么? 也就是说,列出可能的id,名称和客户需要更多信息就足够了,他可以通过/ cars / {id}查询更多细节。

2 个答案:

答案 0 :(得分:2)

这可能是Jackon @JsonView注释的一个很好的候选者。我通常在一个公共包中定义一些标记接口(可以在应用程序中重用):

public interface View {
    public interface Partial { }
    public interface Full extends Partial { }
}

然后你可以在汽车类中使用它们:

public class Car {
    private int id;
    private String name;
    //Supresses serialization of this property when another view is active
    @JsonView(View.Full.class)
    private String description;

    ......
}

最后激活资源中的相应视图:

@Path("/")
@JsonView(View.Partial.class)
public Collection<Car> getAll();

@Path("/{id}")
@JsonView(View.Full.class)
public Car getById(@PathParam("id") int id);

请注意,从@JsonView(View.Partial.class)方法中省略getAll()将导致所有属性被序列化(在这种情况下,人们可能希望description不被序列化)。这是因为Jackson禁用了视图处理并忽略了所有视图注释,除非为渲染指定了显式视图。我为此编写了一个解决方法(这样,当没有指定视图时,只有属于默认视图的属性被序列化)。我只能将它用于序列化而不是反序列化,如果你感兴趣我可以尝试挖掘它。

答案 1 :(得分:0)

假设您在后端使用了一些ORM库,请定义两个不同的类:一个映射该实体的所有详细信息,另一个只显示与概述相关的一些属性。然后在两种方法中将这些返回到不同的类型。

我认为这是一个非常标准的模式,至少我在我一直在研究的项目中遇到过这种技术。