1

我正在构建一个简单的 RESTFul 服务;为了实现这一点,我需要两个任务:

  • 从请求参数中获取我的资源(即 Book)的实例,以便我可以持久化该实例
  • 从该实例构建 XML 文档以将表示发送到客户端

现在,我正在我的 POJO 课程中做这两件事:

public class Book implements Serializable {

    private Long id;

    public Book(Form form) {
        //Initializing attributes
        id = Long.parseLong(form.getFirstValue(Book.CODE_ELEMENT));
    }

    public Element toXml(Document document) {
        // Getting an XML Representation of the Book
        Element bookElement = document.createElement(BOOK_ELEMENT);
    }

我记得一个 OO 原则,它说行为应该在数据所在的位置,但现在我的 POJO 依赖于请求和 XML API,感觉不对(而且,该类具有持久性注释)

是否有任何标准方法/模式来解决该问题?

编辑: 我使用的库是 Restlets 和 Objectify。

4

2 回答 2

1

当您说行为应该在数据所在的位置时,我同意您的看法。但同时,正如你所说,我只是不喜欢用用于序列化手段的特定方法污染 POJO 接口(根据你想要的方式,它可以显着增长 - JSON、XML 等)。

1) 从该实例构建一个 XML 文档以将表示发送给客户端

为了将对象与序列化逻辑分离,我将采用策略模式

interface BookSerializerStrategy {
    String serialize(Book book);
}

public class XmlBookSerializerStrategy implements BookSerializerStrategy {

    public String serialize(Book book) {
        // Do something to serialize your book.
    }

}

public class JsonBookSerializerStrategy implements BookSerializerStrategy {

    public String serialize(Book book) {
        // Do something to serialize your book.
    }

}

您的 POJO 接口将变为:

public class Book implements Serializable {

    private Long id;
    private BookSerializerStrategy serializer

    public String serialize() {
        return serializer.serialize(this);
    }

    public void setSerializer(BookSerializerStrategy serializer) {
        this.serializer = serializer;
    }
}

使用这种方法,您将能够在一个地方隔离序列化逻辑,并且不会污染您的 POJO。此外,返回一个 String 我不需要将 POJO 与类DocumentElement结合起来。

2)从请求参数中获取我的资源(即书)的一个实例,这样我就可以让那个实例被持久化

在我看来,找到一种处理反序列化的模式更为复杂。我真的没有看到比使用静态方法创建工厂以从 POJO 中删除此逻辑更好的方法。

回答您的两个问题的另一种方法类似于 JAXB 使用的方法:两个不同的对象,一个负责反序列化的Unmarshaller和一个负责序列化的Marshaller。从 Java 1.6 开始,JAXB 默认随 JDK 一起提供。

最后,这些只是建议。实际上,我对您的问题非常感兴趣,并对其他可能的解决方案感到好奇。

于 2012-04-17T10:35:13.270 回答
0

您是否在项目中使用 Spring 或任何其他框架?如果您使用 Spring,它将为您处理序列化,并将请求参数分配给方法参数(根据需要进行解析)。

于 2012-04-15T16:43:46.200 回答