Java 序列化集合/聚合并在REST中合并模型和资源

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

我正在开发一个RESTAPI,以便将数据从客户端应用程序传输到web应用程序

到目前为止,一切都很顺利:我在客户机应用程序中创建了我的实体对象,然后用Jersey将它们序列化为XML/JSON,并调用PUT,另一端是一个资源侦听PUT,然后神奇地将它们序列化为准备用JPA持久化的对象

下面是一个带有注释和相关资源的实体相册示例

@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纯粹主义者,但没有人谈论这样的问题