JAX-RS возвращает карту <String, String> - PullRequest
1 голос
/ 06 февраля 2012

Я хочу получить карту с использованием JAX-RS (text / xml)

@GET
public Map<String,String> getMap(){
}

но я получаю ошибку ниже:

0000001e FlushResultHa E org.apache.wink.server.internal.handlers.FlushResultHandler handleResponse The system could not find a javax.ws.rs.ext.MessageBodyWriter or a DataSourceProvider class for the java.util.HashMap type and application/x-ms-application mediaType.  Ensure that a javax.ws.rs.ext.MessageBodyWriter exists in the JAX-RS application for the type and media type specified.
[10:43:52:885 IST 07/02/12] 0000001e RequestProces I org.apache.wink.server.internal.RequestProcessor logException The following error occurred during the invocation of the handlers chain: WebApplicationException (500 - Internal Server Error) with message 'null' while processing GET request sent to http://localhost:9080/jaxrs_module/echo/upload/getSiteNames

Ответы [ 4 ]

4 голосов
/ 08 февраля 2012

Решение, которое я выбрал, - обернуть карту и использовать ее в качестве возвращаемого параметра.

@XmlRootElement
public class JaxrsMapWrapper {

    private Map<String,String> map;

    public JaxrsMapWrapper(){

    }

    public void setMap(Map<String,String> map) {
        this.map = map;
    }

    public Map<String,String> getMap() {
        return map;
    }
}

и подпись метода будет выглядеть следующим образом

@GET
public JaxrsMapWrapper getMap()
3 голосов
/ 07 февраля 2012

Ваша проблема в том, что стратегия сериализации по умолчанию (используйте JAXB) означает, что вы не можете сериализовать эту карту напрямую.Есть два основных способа справиться с этим.

Написать XmlAdaptor

Есть несколько вопросов по этому вопросу на SO, но самое хорошее объяснение, которое я видел до сих пор, это в списке рассылки пользователей CXF несколько лет назад.Один хитрый момент (так как вам не нужен дополнительный элемент-обертка) заключается в том, что, получив у вас адаптер типа, вы должны установить его с помощью аннотации на уровне пакета (направильный пакет, который может потребовать некоторых усилий, чтобы выяснить).Это относительно экзотично.

Пишем пользовательский MessageBodyWriter

Вполне возможно, будет проще написать собственный код для выполнения сериализации.Чтобы сделать это, вы реализуете javax.ws.rs.ext.MessageBodyWriter и помечаете его @Provider (при условии, что вы используете механизм, который использует это для управления регистрацией; не все делают по сложным причинам, которые не имеют большого значенияВот).Это позволит вам создать ровно документ, который вы хотите, из любого произвольного типа за счет большей сложности при написании (но, по крайней мере, у вас не будет сложных проблем JAXB).Существует множество способов создания XML, из которых можно выбирать в зависимости от сериализуемых данных

Обратите внимание, что если бы вы выполняли потоковую передачу данных, а не собирали все данные в памяти, вы бы есть для реализации этого интерфейса.

2 голосов
/ 06 ноября 2012

Используя CXF 2.4.2, он поддерживает возврат Map из API. Я использую Jackson-Jaxrs 1.9.6 для сериализации.

@Path("participation")
@Consumes({"application/json"})
@Produces({"application/json"})
public interface SurveyParticipationApi {

    @GET
    @Path("appParameters")
    Map<String,String> getAppParameters();
    ....
}
0 голосов
/ 24 апреля 2014

С использованием CXF 2.7.x

WebClient.postCollection(Object collection, Class<T> memberClass, Class<T> responseClass)

, вот так в коде вашего отдыха клиента.

(Map<String, Region>) client.postCollection(regionCodes, String.class,Map.class);

для других коллекций используйте WebClient.postAndGetCollection().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...