2016-11-04 96 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

我必須將其轉換爲每個結果,這是很多垃圾代碼。我無法得到,我的控制器應該在這種結構中做什麼?只有路由和呼叫服務?我認爲控制器是這個轉換的好地方 –