2015-02-24 124 views

回答

7

我想你是问在哪里写整个实体 - > DTO转换逻辑。

像你的实体

class StudentEntity { 
int age ; 
String name; 

//getter 
//setter 

public StudentDTO _toConvertStudentDTO(){ 
    StudentDTO dto = new StudentDTO(); 
    //set dto values here from StudentEntity 
    return dto; 
} 

} 

你的DTO应该像

class StudentDTO { 
int age ; 
String name; 

//getter 
//setter 

public StudentEntity _toConvertStudentEntity(){ 
    StudentEntity entity = new StudentEntity(); 
    //set entity values here from StudentDTO 
    return entity ; 
} 

} 

和你的控制器应该像

@Controller 
class MyController { 

    public String my(){ 

    //Call the conversion method here like 
    StudentEntity entity = myDao.getStudent(1); 
    StudentDTO dto = entity._toConvertStudentDTO(); 

    //As vice versa 

    } 

} 
+0

一个问题没有任何模块化的东西。这是如何做这种转换的简单问题。 – 2017-11-29 07:49:48

+0

答案已经被接受。 – 2017-11-29 07:52:22

+0

如果关心模块性,这种方法会迫使DTO依赖于实体,反之亦然。而且,在多模块项目中,如果您的实体和DTO在单独的模块中(通常是这种情况),这将导致循环依赖。结帐[这个答案](https://stackoverflow.com/a/44561593/3381334) – parth 2017-11-29 14:44:20

3

在我看来

  • 实体 - 验证后>实体转换,应在控制器要做的事 - > DTO的转换应在控制器进行调度jsp页面
  • 的DTO前DTO从jsp页面返回

它为您提供了对进程的更多控制,并且您不必在每次填充实体的某个逻辑被更改时都更改服务/持久性类。

+0

同意。另外,如果将Entity和DTO中的转换逻辑组合在一起,则两者不能分离为单独的JAR构件。例如,DTO类不能在没有包含实体的情况下提供给第三方,实体(大多数情况下)您不希望这样做。 – 2017-06-13 23:47:51

3

这是公认的答案,但虽然以一个老问题使用model-mapper API以简单的方式更新它。

<dependency> 
    <groupId>org.modelmapper</groupId> 
    <artifactId>modelmapper</artifactId> 
    <version>0.7.4</version> 
</dependency> 

使用这个API,你避免手工二传手&干将为接受的答案解释。

在我看来,这两种转换都应该在控制器中使用私有工具方法,并使用Java8流的映射(如果交换DTO集合),如​​中所示。

它应该发生在控制器上,因为DTO意味着独占传输对象。我不会让我的DTO进一步下降。

您的代码服务&实体上的数据访问层,并在调用服务方法之前将DTO转换为实体&在返回控制器响应之前将实体转换为DTO。

我更喜欢这种方法,因为实体很少改变,数据可以根据需要添加/从DTO中删除。

详细模型映射器的配置和规则被描述here

相关问题