2017-03-17 104 views
0

我使用澤西和JAXB爲了輸出JSON爲webservice調用,我有一個泛型類型層次結構域模型類,我需要輸出特定的結果類:如何使用多態性和泛型類層次與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(); 
} 

在我的web服務我回:

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

E.g. new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(),它將一個對象漂亮地映射到String

我創建了一個接口JSONMappable,讓我寫對象作爲迴應或對象

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這個接口。

因此,在你的web服務,你會使用

return offerService.getOfferList(params).asJSONOKResponse; 

接口的使用雜波最大限度地減少了Web服務