Java “如何实施”;豆子“;及;“bean映射”;密码?

Java “如何实施”;豆子“;及;“bean映射”;密码?,java,data-structures,javabeans,Java,Data Structures,Javabeans,我们有“bean”,可以序列化为JSON,然后返回到(基于vue.js的)UI层。到目前为止,我的豆子是这样的: public class ExampleBean { private final int id; private final String name; public ExampleBean(int id, String name) { this.id = id; ... } // getter for all fields } 它们由一些映射器实例化:

我们有“bean”,可以序列化为JSON,然后返回到(基于vue.js的)UI层。到目前为止,我的豆子是这样的:

public class ExampleBean {
  private final int id;
  private final String name;
  public ExampleBean(int id, String name) {
    this.id = id; ...
  }
  // getter for all fields
}
它们由一些映射器实例化:

public ExampleBean map(SomeInternalThing foo)  {
   int id = getIdFromFoo(foo);
   String name = doSomethingElse(foo.itsBar());
   return new ExampleBean(id, name);
}
然后我有一些单元测试(针对映射器):

这种方法的主要优点是bean对象是不可变的(当我忘记初始化字段时,编译器会告诉我)

但是:该bean的字段数量不断增加。
SomeInternalThing
上下文可能有30到50个“属性”,并且bean中所需的字段数。。。现在从3点到5点到8点

真正“杀死”我的是,映射代码对每个必填字段执行不同的操作。这需要我处理越来越多的“通用”模拟规范


到目前为止,我想知道是否有更好的选择来实现这种“仅数据对象”

在创建数据对象时,我个人更喜欢lombok()。它去掉了样板代码。您应该看看“@Builder”和“@Data”注释

因为使用lombok始终是团队的决定,所以您可以从自己实现构建器模式开始(对于这样的数据对象)

这使您能够单独设置每个属性,并单独测试每个属性

Being说你可能不应该对每个字段都使用构造函数。 (见龙目岛的@AllArgsConstructor)
正如您在这里看到的()bean应该有一个公共的默认构造函数

我同意Lombok可能会解决我的问题,因为它可以切换到Kotlin或Scala这样的语言,这样就可以用更少的模板实现。。。但是,唉,没有机会让龙目巨人进入我们的工具链。所以我很感激你的意见,但这对我没有帮助-|好吧,这很悲哀,但是实现构建器模式仍然是一种选择。我想我的问题不是bean本身,而是所有映射都在映射器中同时发生的事实。我认为这是正确的方法。。也许您可以像在数据规范化方法中那样拆分数据对象。例如,一个人有一个名字、姓氏、街道、门牌号->你可以通过给他一个地址参考(person:{name,姓氏,address}+address:{street,number}),使其正常化,但我想有时候这并不实际,我用它来映射JPA实体与DTO之间的关系。我们在视图层中使用DTO。使用MapStruct,您可以自动生成映射器,并在必要时使用注释进行自定义。但是,不确定它在不可变DTO中的工作情况如何。如何传输映射器方法的逻辑并使用真正的转储映射器逻辑?在我看来,这将导致对映射器和逻辑进行更简单的测试。地图绘制者不是真正的问题。你需要它们,因为模型就是这样设计的。否则,您应该返工所有模型类。但这有可能吗?对于实际模型,我认为模拟映射任务似乎很昂贵,太昂贵了。也许您应该测试映射器与实际使用它的类的集成。这会使映射器被多次测试,但如果它使您的测试类难以读取和维护,那么隔离它们的价值是什么呢?
@Test
public void testGetId() {
  ... do some mocking setup so that the mapper can do its job
  assertThat(mapperUnderTest.map(someFoo).getId(), is(5));
}