Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 集合和jax-rs_Java_Jackson_Jax Rs - Fatal编程技术网

Java 集合和jax-rs

Java 集合和jax-rs,java,jackson,jax-rs,Java,Jackson,Jax Rs,假设我有一个集合,/cars,它支持通常的操作,我还支持/cars/{id} 当我得到get for/cars时,仅返回集合元素的有限“视图”的最佳实践是什么? 也就是说,列出可能的id、名称就足够了,客户机需要进一步的信息,他可以通过/cars/{id}查询更详细的信息。假设您在后端使用一些ORM库,定义两个不同的类:一个映射该实体的所有细节,另一个只映射与概述相关的几个属性。然后,在两个方法中将它们返回到不同的类型 我认为这是一个非常标准的模式,至少我在我所从事的项目中遇到过这种技术。这可能

假设我有一个集合,/cars,它支持通常的操作,我还支持/cars/{id}

当我得到get for/cars时,仅返回集合元素的有限“视图”的最佳实践是什么?
也就是说,列出可能的id、名称就足够了,客户机需要进一步的信息,他可以通过/cars/{id}查询更详细的信息。

假设您在后端使用一些ORM库,定义两个不同的类:一个映射该实体的所有细节,另一个只映射与概述相关的几个属性。然后,在两个方法中将它们返回到不同的类型


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

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

然后你可以在汽车类中使用它们,如下所示:

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);
@Path(“/”)
@JsonView(View.Partial.class)
公共集合getAll();
@路径(“/{id}”)
@JsonView(View.Full.class)
公共汽车getById(@PathParam(“id”)int-id);

需要注意的是,从
getAll()
方法中ommiting
@JsonView(View.Partial.class)
将导致所有属性被序列化(在这种情况下,可能期望
description
不会被序列化)。这是因为Jackson禁用视图处理并忽略所有视图注释,除非为渲染指定了显式视图。我为此编写了一个变通方法(这样,当没有指定视图时,只序列化属于默认视图的属性)。我只能让它用于序列化,但不能用于反序列化,如果您感兴趣,我可以试着把它挖出来。

当然可以,但它感觉非常粗糙,会导致代码重复。我真的希望有一个更好的解决方案…它确实会导致一些代码重复,但是一个具有一些属性和相应映射元数据的类是相当轻量级的。应用一些聪明的过滤拦截器/方面/任何乍一看似乎很酷的东西,但这是一种使代码更难理解和维护的黑客行为。在我看来,在阅读代码时立即反映您意图的简单解决方案总是更好的。您将如何从代码库中使用这种方法?假设你已经准备好了一份清单;然后,您是否会使用所需的资源创建一个SimpleCar,并将每辆车都包装到这个SimpleCar中?这意味着每次返回时,我都必须调用一个“transformer”方法,代码混乱。如果您的API在这方面是后续的,并且总是在客户端请求集合时返回SimpleCars,那么您应该有一个能够加载列表的存储库。如果不是这样的话,那么您可能是对的,并且需要对序列化过程进行一些修改,以过滤实体的属性。好的,我刚刚用IBM的WebSphere Liberty概要文件进行了尝试,但遗憾的是无法使其工作。您能详细说明吗?您在定义和使用视图时遇到问题,还是在运行时没有达到预期效果?Liberty 8.5.0.x忽略了资源方法上的JsonView注释,因此ObjectMapper不知道要使用哪个视图。我将在以后的版本中与支持它的人交谈。嗯,我对自由没有任何经验。实际上是
JacksonJsonProvider
应该在注释中找到它,您是否能够向Liberty注册此提供程序并让它处理JSON读/写?
@Path("/")
@JsonView(View.Partial.class)
public Collection<Car> getAll();

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