2016-03-24 3 views
1

Мой код:HashMap в ответ JSON в Джерси 2

@Path("/pac") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    @Component 
    public class LDAPResource { 
     @Autowired 
     private LDAP_PAC_Service pacService; 

     @GET 
     @Path("/query/{userID}") 
     public Response getPAC(@PathParam("userID") String userID) { 
      return Response.ok().entity(pacService.getPAC(userID)).build(); 
     } 
    } 

pacService.getPAC(userID) возвращает HashMap<String, String>

Он кашляет, когда я пытаюсь вернуть APPLICATION_JSON, я получаю

SEVERE: MessageBodyWriter not found for media type=application/json, type=class java.util.HashMap, genericType=class java.util.HashMap. 

Что это самый простой способ для этого? Благодаря

ответ

2

Если вы хотите использовать Jackson as your JSON provider, добавив эту зависимость к вашему pom.xml должно быть достаточно:

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>2.22.2</version> 
</dependency> 

Чтобы найти другие варианты, см: https://jersey.java.net/documentation/latest/media.html

1

Самый простой способ я знаю состоит в том, чтобы использовать ObjectMapper и передать на карту свой метод writeValueAsString(). Например:

import com.fasterxml.jackson.databind.ObjectMapper; 

    Map<String, String> mapData = new HashMap<>(); 
    mapData.put("1", "one"); 
    mapData.put("2", "two"); 
    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.writeValueAsString(mapData); 

возвращаемая строка "{" 2 ":" два " "1": "один"}".

Джерси внутренне содержит поставщиков сущностей для типа String, поэтому это должно работать.

Лучше написать собственный MessageBodyWritter, чтобы разместить больше вариантов использования и упростить процесс. Вы можете найти документацию here

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