2010-10-22 4 views
1

Hier, j'ai essayé d'utiliser le côté client du framework RestEasy. L'interface a une méthode:Valeur de Rest Easy Client Framework perdue après unmarshaling

@PUT 
@Path("document/autoincrement") 
@Consumes("application/xml") 
BaseClientResponse<String> insertPointOfInterest(PoiDocument poiDocument); 

et l'appel à certains (Jersey) le service reste ressemble à:

String restServerServiceUrl = "http://my.jersey.server/rest/serviceFoo/v1/"; 
    NSSClientService client = ProxyFactory.create(NSSClientService.class, restServerServiceUrl); 

    PoiDocument poiDocument = new PoiDocument("Parkirišče", "90", 390262.85133115170, 42240.33558245482); 

    BaseClientResponse<String> response = client.insertPointOfInterest(poiDocument); 
    assert response.getResponseStatus() == Response.Status.OK; 

    // Expected result 
    //<?xml version="1.0" encoding="UTF-8" standalone="yes"?><insertedRecord><record>14</record></insertedRecord> 

    logger.info("Returned: " + response.getEntity()); 

Et l'impression enregistreur:

Type de prévu .

Mais je veux un objet pas une chaîne, donc je peux facilement affirmer les valeurs retournées. L'interface:

@PUT 
@Path("document/autoincrement") 
@Consumes("application/xml") 
BaseClientResponse<InsertedResponse> insertPointOfInterest(PoiDocument poiDocument); 

Au lieu de chaîne il y a maintenant une classe InsertedResponse qui ressemble à:

@XmlRootElement(name="insertedRecord") 
public class InsertedResponse extends ResponseResult{ 

    String insertedRecord; 

    public InsertedResponse(int insertedRecord) { 
     this.insertedRecord = Integer.toString(insertedRecord); 
    } 

    public InsertedResponse(){ 
     insertedRecord = ""; 
    } 

    @XmlElement(name="record") 
    public String getInsertedRecords(){ 
     return insertedRecord; 
    } 

    public void add(int recNo) { 
     insertedRecord = Integer.toString(recNo); 
    } 
} 

... et sa superclasse:

@XmlRootElement(name = "result") 
public abstract class ResponseResult { 

    protected String getClearString(String string) { 

     if (string != null) { 
      return Constants.removeInvalidXMLCharacters(string); 

     } 
     return ""; 
    } 
} 

Maintenant, quand je change la appel du client également à:

BaseClientResponse<InsertedResponse> response = client.insertPointOfInterest(poiDocument); 
    logger.info("Returned: " + response.getEntity().getInsertedRecords()); 

Je reçois une chaîne vide au lieu d'une valeur. Donc, la question est - où est la valeur d'aller? Il devrait imprimer un nombre, comme 14 dans l'exemple ci-dessus.

Répondre

0

Une annotation JAXB manquante (@XmlSeeAlso)

@XmlRootElement(name = "result") 
@XmlSeeAlso({ InsertedResponse.class, OtherChild.class, SomeOtherChild.class }) 
public abstract class ResponseResult { 

    ... 
} 

et un mutateur ajouté

@XmlRootElement(name="insertedRecord") 
public class InsertedResponse extends ResponseResult{ 

    ... 

    public void setInsertedRecords(String insertedRecord) {    
     this.insertedRecord = insertedRecord; 
    } 

résolu le problème.