2016-11-04 4 views
0

엔티티를 DTO 개체로 수동으로 변환하여 응답하는 데 어려움을 겪은 후이를 수행하는 최적의 방법을 찾기 시작합니다. 봄은 어떻게하면 @RestController 메서드에서 반환하는 객체를 변환 할 수 있습니까?스프링 MVC 나머지. 응답 개체 변환

처럼, 내가 방법을

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

을 그리고 EntityDTO 클래스로 변환 할 수는 JSON 변환되기 전에 내가, 내 엔티티를 원하는 경우. (예 : Converter<S,T> 사용) 나는 모든 엔티티에 대해 사용자 정의 JacksonSerializer을 쓰고 싶지 않습니다. 나는 Google에 그걸 시도했지만 결과는 없었다. 나는 봄이 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); 
    } 
} 

그래서 서비스에서 필요한 객체를 반환하면 스프링은 간단한 java- json 매핑을 수행합니다.

매퍼 클래스는 org.dozer.Mapper입니다. 이 라이브러리를 사용하여 객체를 매핑하는 것이 훨씬 쉽습니다. 예제를 확인할 수 있습니다 : http://dozer.sourceforge.net/documentation/gettingstarted.html

+0

엔티티 -> dto를 변환하는 선언적 방법을 찾고 있습니다. DTO 클래스를 만들고, 대상 클래스를 표시하고, 해당 쌍의 래퍼를 만들고 싶습니다. 또한 다른 서비스가이를 소비하기 때문에 Entity 클래스를 반환하는 서비스. 나는 다른 몇몇 작업으로 필드를 변환하는 것만으로도 서비스 계층의 일부가 될 것이라고 생각하지 않는다. 이 데이터를 표현하는 방법을 변경하는 것입니다. –

+0

더 선언적 일 수있는 것은 입니다. Dto dto = mapper.map (obj, Dto.class); 또한 서비스가 모든 데이터 조작 작업에 적합한 장소라고 생각합니다. 예를 들어 기본 구조에 대해 이야기하고 있습니다. dao-> service> 컨트롤러 db/cache-> 엔티티 검색에서 다른 엔티티로 변환/계산/채우기/집계 -> 응답 작성 방법을 선택하십시오. 당신은 디플레이션을 바꾸지 않습니다. 데이터를 변경하는 것뿐입니다 (두 경우 모두 JSON 객체 표현을 반환하는 방법). –

+0

모든 결과에 대해 변환해야합니다. 많은 쓰레기 코드입니다. 내 컨트롤러가이 구조에서해야 할 일은 없습니까? 라우팅 및 호출 서비스 만 할 수 있습니까? 난 컨트롤러 가이 변환을위한 좋은 장소라고 생각 했어 –