2012-04-15 30 views
1

我正在构建一个简单的RESTFul服务;并为实现这一目标,我需要两个任务:模式:从参数填充实例并将其导出到XML

  • 把我从请求参数资源(如图书)的一个实例,这样我就可以得到该实例被持久化
  • 从实例中建立一个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); 
    } 

我想起了一个面向对象的原则是说,behav ior应该是数据所在的位置,但是现在我的POJO依赖于Request和XML API,并且感觉不对(这个类还有持久性偏移)

有没有解决这个问题的标准方法/模式?

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

回答

1

当你说行为应该在数据所在的位置时,我同意你的意见。但是与此同时,正如你所说的,我只是不觉得用用于序列化方法的特定方法来污染POJO接口是可以舒适的(它可以根据你想要的方式--JSON,XML等而显着增长)。

1)从实例构建一个XML文档来表示发送到客户

为了解耦序列化逻辑的对象,我会采取Strategy Pattern

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。此外,返回一个字符串,我不会需要你POJO与类文档元素

2)把我从请求参数资源(如图书)的一个实例,这样我就可以得到该实例被持久化

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

另一种方法来回答你的两个问题将类似于JAXB使用:两个不同的对象,一个 Unmarshaller的负责反序列化和的Marshaller进行序列化。自Java 1.6以来,JAXB默认使用JDK。

最后,这些只是建议。我对你的问题真的很感兴趣,并对其他可能的解决方案感到好奇。

0

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

+0

我以前用过Spring并且对它有很好的支持,但是我目前的项目根本不使用Spring – 2012-04-15 17:05:11

+0

你有没有试过Jaxb? – 2012-04-15 17:13:30

+0

我正在使用Restlet XML工具。我在寻找的是处理这个问题的模式,而不是一个额外的库。或者,也许,我只需要用静态方法:S – 2012-04-15 18:01:46

相关问题