Значение Rest Easy Client Framework теряется после демаршалинга - PullRequest
1 голос
/ 22 октября 2010

Вчера я пытался использовать клиентскую часть фреймворка RestEasy.Интерфейс имеет метод:

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

, и вызов в какую-то службу отдыха (Джерси) выглядит следующим образом:

    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());

А регистратор печатает:

14

Вид ожидаемого.

Но я хочу, чтобы объект не был строкой, поэтому я могу легко утверждать возвращаемые значения.Интерфейс:

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

Вместо String теперь есть класс InsertedResponse, который выглядит следующим образом:

@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);
    }
}

... и его суперкласс:

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

    protected String getClearString(String string) {

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

        }
        return "";
    }
}

Теперь, когда я изменяю клиентский вызов также на:

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

, вместо некоторого значения я получаю пустую строку.

Итак, вопрос в том - куда делось значение go?Следует напечатать число, например 14 в приведенном выше примере.

1 Ответ

0 голосов
/ 25 октября 2010

Одна недостающая аннотация JAXB (@XmlSeeAlso)

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

    ...
}

и добавленный метод установки

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

    ...

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

решил проблему.

...