2016-11-04 56 views
0

经过手动将实体手动转换为响应的DTO对象之后,我开始寻找最佳方式来执行此操作。 春天是否允许以某种方式转换一个对象,我从@RestController方法返回?Spring MVC休息。转换响应对象

一样,如果我有方法

public ResponseEntity foo(){ 
    return new ReponseEntity(new Entity(),ResponseStatus.OK); 
} 

而且我想我的实体,之前被转换成JSON,将被转换为EntityDTO类。 (例如使用Converter<S,T>) 我不想为我拥有的每个实体编写自定义JacksonSerializer。 我试图谷歌,但没有结果。我知道春天有Formatter s和Converter s,但我无法得到是否有可能以某种方式在这里使用它们。

现在,我正在使用该功能的自定义实现,包括方面和一些反射,但我不知道是否有更好的方法。

回答

0

我建议你在服务层做它,我认为控制器不应该做这样的事情。

@Component 
class EntityService{ 
@Resource 
Mapper mapper; 

public EntityDTO getEntityDTO(long id){ 
Entity entity = dao.getEntity(id); 
return mapper.map(entity,EntityDTO.class); 
} 

} 

@RestController 
public class UserRestService 
{ 
    @RequestMapping(...) 
    public ResponseEntity<List<EntityDTO>> getEntityDTO() 
    { 
    return new ResponseEntity<List<EntityDTO>>(entityService.getEntityDTO(...), HttpStatus.OK); 
    } 
} 

因此,您将返回所需的服务对象,并且spring将为您执行简单的java-> json映射。

This Mapper class is org.dozer.Mapper。使用这个库对象映射要容易得多,你可以检查一下例子: http://dozer.sourceforge.net/documentation/gettingstarted.html

+0

我正在寻找声明方式来转换entity - > dto。我想创建DTO类,将其标记为目标类,并为该对创建包装。此外,我的服务返回实体类,因为其他服务消耗它们。我不认为只是将其他操作转换成字段值得成为服务层的一部分。这只是改变了我将这些数据表示为视图的方式 –

+0

还有什么更具说明性的 Dto dto = mapper.map(obj,Dto.class);我也相信服务是任何数据操作的正确场所。我正在谈论失效层结构,例如 dao->服务>控制器 从db/cache->转换/计算/填充/与其他实体一起收集实体 - >选择构建响应的方式。 你并没有改变方式去desplay,你只是改变数据(方式是返回两种情况下的JSON对象表示)。 –

+0

我必须将其转换为每个结果,这是很多垃圾代码。我无法得到,我的控制器应该在这种结构中做什么?只有路由和呼叫服务?我认为控制器是这个转换的好地方 –