2013-04-30 2 views
2

JAX-RS, Jackson 및 JPA를 사용하는 프로젝트에서 작업 중입니다. JAX-RS 리소스는 들어오는 JSON을 궁극적으로 영속화 될 POJO (JPA)에 직접 매핑합니다. POJO가 1 :JAX-RS 및 Jackson으로 추가 매개 변수 매핑

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
public Response createEntity(Entity entity) { 
    ... 
} 

그러나, 나는 때때로 정보 자원이 깔끔하게 1지도를하지 않는 클라이언트에서 필요로하는 것을 찾을 수 있습니다. 요청을 처리하는 방법에 대한 일부 메타 데이터를 제공하는 추가 필드가 있습니다. 예를 들어, 콜백 URL 또는 유지되지 않는 일반 텍스트 암호입니다.

여전히 JPA 엔티티에 직접 매핑되는 동안이 정보를 유지하는 우아한 방법이 있습니까?

나는 몇 가지 아이디어를 가지고,하지만 난 그들 중 함께 흥분 아니에요 그런 다음 특정 속성을 무시하도록 구성하는 개체에 매핑 할 ObjectMapper를 사용

  1. 먼저지도 Map<String, Object>에 . 결과적으로 특정 리소스에 대한 보일러 플레이트 코드가 추가됩니다 (일관성을 위해 JSON을 소비하는 모든 리소스)
  2. 여분의 값을 위해 @Transient 필드 사용 : 이렇게하면 잭슨이 POJO에 완전히 매핑되지만 데이터 모델이 복잡해집니다. 사업체의 상태와 행동에 대해 스스로를 고려하는 대신 비즈니스 로직을 사용하는 것입니다.
  3. 여분의 값으로 @QueryParam을 사용하십시오. : 리소스에 대한 인터페이스가 복잡해 보이고 클라이언트 관점에서 임의로 보입니다.

아이디어가 있으십니까? JAX-RS MessageBodyReader 나 어떤 종류의 컨텍스트 프로 바이더를 추가 매개 변수의 맵을 메서드에 추가 인수로 전달할 수 있다면 좋겠지 만, 얼마나 많은 일이 될지 모르겠다.

답변

2

이 유스 케이스는 종종 자원 레벨에서 Dozer과 같은 프레임 워크에 의해 JPA 엔티티에 맵핑되는 전용 데이터 전송 오브젝트를 사용하여 처리됩니다. 자원이 HATEOAS 원칙을 따른다면 엔티티는 자신의 링크와 같은 더 REST 특정 정보, 기타 자원 및 페이지 매김 정보에 대한 링크 풍부해야

  • : 명백한 상용구 코드 외에도,이 방법의 장점이있다.
  • 종종 REST 클라이언트는 entity expansion 속성 (대역폭 이유 때문에 엔터티 또는 참조 된 엔터티의 속성이 응답에 포함되어야 함)을 지정할 수있는 옵션이 있습니다. 여기서는 적어도 필터를 엔터티에 적용해야합니다.

JSON 매핑을 위해 JPA 엔티티를 다시 사용하려는 경우 귀하의 아이디어가 모두 유효하다고 생각합니다. 두 번째 아이디어의 또 다른 변형은이 추가 정보를 엔티티의 일부로 맵에 저장하는 것입니다 (JPA 엔티티에 공통 기본 클래스가있는 경우 많은 비즈니스 논리 대신 비즈니스 논리가 혼란스럽게 처리되도록 단일 속성을 갖는 것) 거기서 끝났어. 이를 달성하기 위해 @JsonAnySetter 주석을 사용할 수 있습니다.