2017-03-17 8 views
0

webservice呼び出し用のJSONを出力するためにJerseyとJAXBを使用しています。ドメインモデルクラスからジェネリック型のクラス階層を持っています。クラス:私のwebサービスでJAXBでポリモーフィズムとジェネリッククラス階層を使用する方法

@XmlRootElement 
public class OfferDto extends BaseEntity<String> { 
    private String name; 
    private String description; 

// ... 
} 
public class OfferListResponse extends BaseListResponseImpl<OfferDto> { 
} 



public abstract class BaseListResponseImpl<T> implements BaseListResponse<T> { 

    private List<T> data; 
    public List<T> getData() { 
     return data; 
    } 
    public void setData(List<T> data) { 
     this.data = data; 
    }  
} 



public interface BaseListResponse<T> extends Serializable { 
    public List<T> getData(); 
} 

私は返す:

OfferListResponse resp = offerService.getOfferList(params); 
Response.status(Response.Status.OK).entity(resp).build(); 

が、私のJSONはとして出力されている:

{"data":["[email protected]","[email protected]", ..."}]} 

JAXBがオブジェクトフィールドを適切に出力する代わりにtoStringメソッドを呼び出しているようです。

私は任意の継承せずにクラスに直接具体的なタイプを使用する場合:

@XmlRootElement 
public class OfferListResponse { 
    private List<OfferDto> data; 
// ... getters and setters 
} 

今では正常に動作します。

JAXBで多態性クラスと汎用クラス階層を使用するために必要なことを理解しようとしていますか?

答えて

0

ObjectMapperを使用してください。

など。オブジェクトをかなりStringにマップするnew ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString()

私は私が応答などのオブジェクトを作成することができますか

import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 

import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

public interface JSONMappable { 

    ObjectMapper OBJECT_MAPPER = new ObjectMapper(); 

    default Response asOKJsonResponse() { 
    try { 
     String json = OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(this); 
     return Response 
     .ok(json, MediaType.APPLICATION_JSON + "; charset=UTF-8") 
     .build(); 
    } catch (JsonProcessingException e) { 
     return Response.serverError().build(); 
    } 
    } 

    default Object asJSON() { 
    try { 
     return OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(this); 
    } catch (JsonProcessingException e) { 
     return Response.serverError().build(); 
    } 
    } 
} 

は、その後、私はJSONにシリアル化する必要が私のすべてのリソースで、このインタフェースを実装するオブジェクトのインタフェースJSONMappableを作成しました。

だからあなたのWebサービスでは、インターフェイスの使用量はWebサービスに混乱を最小限に抑える

return offerService.getOfferList(params).asJSONOKResponse; 

を使用することになり

関連する問題