Java 序列化集合/聚合并在REST中合并模型和资源
我正在开发一个RESTAPI,以便将数据从客户端应用程序传输到web应用程序 到目前为止,一切都很顺利:我在客户机应用程序中创建了我的实体对象,然后用Jersey将它们序列化为XML/JSON,并调用PUT,另一端是一个资源侦听PUT,然后神奇地将它们序列化为准备用JPA持久化的对象 下面是一个带有注释和相关资源的实体相册示例Java 序列化集合/聚合并在REST中合并模型和资源,java,rest,jpa,serialization,jersey-2.0,Java,Rest,Jpa,Serialization,Jersey 2.0,我正在开发一个RESTAPI,以便将数据从客户端应用程序传输到web应用程序 到目前为止,一切都很顺利:我在客户机应用程序中创建了我的实体对象,然后用Jersey将它们序列化为XML/JSON,并调用PUT,另一端是一个资源侦听PUT,然后神奇地将它们序列化为准备用JPA持久化的对象 下面是一个带有注释和相关资源的实体相册示例 @XmlRootElement @Entity public class Album { @Id private String id; priva
@XmlRootElement
@Entity
public class Album
{
@Id
private String id;
private String name;
@ManyToMany(cascade = CascadeType.ALL)
private Collection<Photos> photos;
// getters/setters
}
@ApplicationPath("webresources")
@Path("/album")
@Stateless
public class AlbumResource extends Application
{
@PUT
@Path("/add")
@Consumes(
{
MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML
})
public Response addAlbum(Album album)
{
try
{
getAlbumEJB().create(album);
}
catch (Exception ex)
{
Logger.getLogger(AlbumResource.class.getName()).log(Level.SEVERE, null, ex);
}
if (!exception)
{
return Response.status(201).entity(album).build();
}
else
{
return Response.status(403).entity(album).build();
}
}
}
尽管根据一些网站的说法,这是一种典型的反模式,将模型和资源混为一谈,但上述方法效果良好。
他们的理由是,上面的例子会崩溃,事实上,要更新一个相册名称,我需要重新发送一个包含整个照片集的PUT,在一个更明确的例子中,我将停止发送大量无用数据,只是为了尊重对象之间的关系
但是,他们没有指出常规的解决方案,因此我提出了这个相当复杂的解决方案,以将映射模型和资源保持在一起,从而利用自动序列化:
我基本上会从客户端发送一个新的实体RESTAlbum,其中包含一个指向照片的链接集合,而不是一个照片集合作为相册实体:
<Album>
<id>73</id>
<name>Great Album</name>
<photosCollection>
<photo>
<href>htttp://example.com/photo/211</href>
</photo>
<photo>
<href>htttp://example.com/photo/232</href>
</photo>
</photosCollection>
</Album>
在服务器端,我将序列化RESTAlbum,并根据其URL获取每个照片实体,并手动构造一个相册实体,我将能够序列化该相册实体
与JPA合作
这是唯一的出路吗
创建所有这些自定义类只是为了序列化关系,这似乎是相当多的工作,奇怪的是,所有的web都充满了REST纯粹主义者,但没有人谈论这样的问题