2012-04-13 4 views
2

отдыхает WebService (с джерси), который возвращает JSON список, если я называю это непосредственно возвращает именно это:javax.xml.bind.UnmarshalException когда запрос остальных службы с JSON джерси клиентом

[{"success":false,"uri":"foo:22","message":"Unknown host : foo"},{"success":true,"uri":"localhost:8082","message":null}] 

генерироваться на этом фрагменте:

@GET 
@Path("/opening/") 
public List<OpeningResult> testOpenings(@QueryParam("uri") List<String> uris) { 
    LOG.debug("testOpenings request uris :[" + uris + "]"); 
    List<OpeningResult> openingResults = infoService.testOpenings(uris); 
    return openingResults; 
} 

это коллекция Pojo, которая выглядит следующим образом:

@XmlRootElement(name = "OpeningResult") 
public class OpeningResult { 

attributes 
... 
getter/setter 

} 

это Pojo является разделяемых через общую банку между сервером и клиентом.

я вызова веб-службы с этим фрагментом:

Client client = Client.create(); 
WebResource resource = client.resource("http://localhost:8080/scheduler/rest/opening"); 
MultivaluedMap<String, String> params = new MultivaluedMapImpl(); 
for (String uri : uris) { 
    params.add("uri", uri); 
} 
List<OpeningResult> results = newArrayList(resource.queryParams(params).get(OpeningResult[].class)); 

добавить некоторый след на стороне сервера, я вижу, что моя служба остальное называется с хорошими параметрами, Buth на стороне клиента, у меня есть это ошибка:

Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"success"). Expected elements are <{}OpeningResult> 

Не знаю, от чего это происходит?

+0

Можете ли вы опубликовать код на стороне сервера, который публикует ваше Pojo? –

+0

Я отредактировал свое сообщение с помощью фрагмента. – Antoine

ответ

0

Проверьте Jersey Client side doc on using JSON. Похоже, что вы по крайней мере, отсутствует аннотацию:

@Produces("application/json") 

Но вы также можете упустить эту функцию фильтров POJO Mapping как для клиентской и серверной стороне. Все это похоже на незначительные изменения конфигурации.

+0

Nop i уже поставил эту аннотацию на класс, а не на каждый метод. И pojo хорошо аннотируется. – Antoine

+0

Функции POJO Mapping не относятся к вашему классу. Это фильтры, которые вы настраиваете для веб-приложения и класса ClientConfig. Это то, что я имел в виду под «фильтрами функций для клиентов и на стороне сервера». http://jersey.java.net/nonav/documentation/latest/json.html#json.jaxb.approach.section –

1

Измените код, чтобы настроить клиент так:

ClientConfig clientConfig = new DefaultClientConfig(); 
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true); 
Client client = Client.create(clientConfig); 

У меня была точно такая же проблема, пока this question and its answers не указал мне в правильном направлении.

Ситуация вызвана значением по умолчанию jersey-json module, используемым для сериализации в JSON и из него, которое не обрабатывает определенные конструкции JSON должным образом.

Вы можете установить флаг FEATURE_POJO_MAPPING, чтобы вместо этого использовать JacksonJsonProvider библиотеки Jackson для сериализации JSON.

Смежные вопросы