1

我正在尝试编写可以从实现相同接口的其他对象创建自己的域对象。我也在对其进行编码,以便他们可以将自己转换为其他实现,基本上是简单的域传输对象。我正在使用杰克逊在实现之间自动转换,以减少手动对象转换容易出错的样板。

用一个例子来展示可能更容易:

//base class
public abstract class DO<T extends Object> {
    public abstract T toDTO();
    public abstract DO<T> fromDTO(T t);
}

//concrete implementation
public class MyDO extends DO<MyDOInterface> implements MyDOInterface {

  public MyDO fromDTO(MyDTO r){
    ObjectMapper mapper = new ObjectMapper();
    return mapper.convertValue(r, MyDO.class);      
  }

  public MyDTO toDTO() {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.convertValue(this, MyDO.class);
  }

  //getters and setters from MyDOInterface
}

现在这在创建 DTO 时可以正常工作,但反过来会有点痛苦。要创建我的域对象,我必须这样做:

MyDO myDO = new MyDO().fromDTO(aDTOInstance);

它创建了一个空对象,以便对其调用 fromDTO(...) 。

我有一种感觉,我错过了一些简单的东西,要么允许我在构造函数中传递 DTO,要么通过静态方法来避免这种情况。甚至是 DO 本身的工厂方法,但我无法弄清楚它是什么。任何人都可以看到使这项工作的方法吗?

4

1 回答 1

0

也许看看@JsonCreator注解:它允许您标记要使用的构造函数和(静态)工厂方法。具体来说,所谓的“委托”创建者,例如:序列化时的另一种可能性是@JsonValue,它允许在序列化过程中进行某些转换。

我不知道这些是否有助于解决特定问题,因为您进行的转换比读/写 JSON 更多,但它们似乎相关。

于 2013-10-23T15:43:13.997 回答