2

JAX-RS呼び出し(CXF)の後にクライアント側に転送するJSONメッセージ構造を構成する次のクラスを使用すると、次のクラスを受け取ります。

org.apache.cxf.jaxrs.client.ClientWebApplicationException: .Problem with reading the response message, class : class bg.vivacom.sel.dto.SELResponse, ContentType : application/json.
...
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not construct instance of bg.vivacom.sel.dto.SELDTO, problem: abstract types can only be instantiated with additional type information
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@16edbe39; line: 1, column: 157] (through reference chain: bg.vivacom.sel.dto.SELResponse["dto"])

返されたオブジェクトには、インターフェイスであるプロパティdtoが含まれています

@XmlRootElement(name = "SELResponse")
public class SELResponse implements Serializable{

@XmlElement(name = "corelationID")
private String corelationID;

@XmlElement(name = "responseTimeStamp")  
private String responseTimeStamp;

@XmlElement(name = "respStatusCode")  
private String respStatusCode;

@XmlElement(name = "respStatusMessage")  
private String respStatusMessage;

@XmlElement(name = "processStatus")  
private ProcessStatus processStatus;

@XmlElement(name = "dto")  
private SELDTO dto; 

インターフェース

public interface SELDTO extends Serializable {

リクエストに応じて、回答にさまざまなDTOを含める方法です。

@XmlRootElement(name = "customerProfile")
public class CustomerProfileDTO implements SELDTO {

@XmlElement(name = "customerCode")
private String customerCode;
...

@XmlRootElement(name = "sms")
public class SmsDTO implements SELDTO {

@XmlElement(name = "From")
private String from;
...

応答を特定のオブジェクトタイプに正しく設定できるように、他にどのようにクラスに注釈を付ける必要があるかについてのアイデア。タイプがわからないdtoオブジェクトを再作成するときに追加情報が必要であることを理解しているので、次のようにインターフェイスに注釈を付けようとしました。

@XmlSeeAlso({CustomerProfileDTO.class, SmsDTO .class})
public interface SELDTO extends Serializable {

しかし、私はまだ問題を抱えています。どんな考えでもいただければ幸いです。

4

1 に答える 1

1

この場合、Jacksonアノテーション「@JsonTypeInfo」を使用することをお勧めします。

ただし、JAXBアノテーションを使用する必要がある場合は、JAXB/XMLでの使用方法と同様の方法を使用してください@XmlElements@XmlElementRefs

     @XmlElements({
             @XmlElement(type=SubClass1.class, name="sub1"),
             @XmlElement(type=SubClass2.class, name="sub2")
     })

ここには、可能なサブタイプへの特定のマッピングを含める必要があることに注意してください。

于 2012-09-12T21:21:44.637 に答える