2016-03-30 4 views
2

Я написал приложение Java (приложение для командной строки), и теперь я пытаюсь преобразовать его в веб-приложение, используя трикотаж и причал. Теперь, как выход класса обслуживания, мне нужно вывести List<List<Map<String,String>>> в формате json. Есть ли способ сделать это? Я новичок в мире сервлетов и т. Д. Я пробовал вот так: @GET @Path ("test") @Produces (MediaType.APPLICATION_JSON) public List >> test() throws FileNotFoundException, IOException, GateException , URISyntaxException {Как вернуть список <Список <Карта <String, String >>> как вывод класса обслуживания отдыха в json?

System.out.println("Starting the App"); 
    System.out.println("Locations added successfully"); 
    DataFile file = new CSVDataFile(); 
    CommandsExecutor.outputsList.add(0, file.performReadOperation(inputFilePath)); 

    System.out.println("Begining execution"); 
    List<List<Map<String, String>>> finalOutput = CommandsExecutor.executeSequentialCommands(file); 
/* for (List<Map<String, String>> tmpList : finalOutput) { 
     for (int i = 0; i < tmpList.size(); i++) { 
      Map<String, String> insideMap = tmpList.get(i); 
      // for (Map.Entry<String, String> entry : insideMap.entrySet()) 
      // { 
      // System.out.println(entry.getKey() + "/" + entry.getValue()); 
      // } 
      JSONObject obj = new JSONObject(insideMap); 
      System.out.println(obj); 
     } 
     System.out.println("\n"); 
    } */ 
    return finalOutput; 
} 

Теперь я получаю сообщение об ошибке, как это: не удается отправить сообщение об ошибке ответа 500: javax.servlet.ServletException: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter не найдено для типа носителя = application/json, type = class java.util.ArrayList, genericType = java.util.List >>.

Что может быть вокруг? Заранее спасибо!!

+0

Я узнал, что если вам трудно понять код ** (Список <Список <Карта <Строка, строка >>>) ** - это потому, что вы что-то делаете неправильно –

ответ

1

Ваш результат JSON может быть что-то вроде:

{ 
    "result": 
    [ 
     [ 
      { 
       "key1":"value1", 
       "key2":"value2", 
       ... 
      }, 
      { 
       "key3":"value3", 
       "key4":"value4" 
       ... 
      }, 
      ... 
     ], 
     ... 
    ] 
} 

В вашей комментировали коду, вы на самом деле уже создали внутреннюю JSONObject для карт, вам просто нужно добавить их к JSONArray, а затем положить этот JSONArray s в другой JSONArray, затем поставьте это окончательное JSONArray в результате JSONObject и верните его.

JSONObject result = new JSONObject(); 
JSONArray array1 = new JSONArray(); 
for (List<Map<String, String>> tmpList : finalOutput) { 
    JSONArray array2 = new JSONArray(); 
    for (int i = 0; i < tmpList.size(); i++) { 
     Map<String, String> insideMap = tmpList.get(i); 
     JSONObject obj = new JSONObject(insideMap); 
     array2.add(obj); 
    } 
    array1.add(array2); 
} 
result.append("result", array1); 

return result.toString(); 
2

Основная причина проблемы - отсутствие фляг. Джерси использует Джексона, поэтому вам нужно будет загрузить банки Джексона.

Вот список всех банок Джексон мне нужно для образца приложение, которое я поставил вместе:

  • ДЖЕКСОНА-аннотаций-2.7.0.jar
  • ДЖЕКСОНА-ядро-2.7.0.jar
  • джексон-DataBind-2.7.0.jar
  • ДЖЕКСОН-jaxrs-1.9.13.jar
  • ДЖЕКСОН-jaxrs-база-2.2.0.jar
  • ДЖЕКСОН-jaxrs-JSON-провайдер 2.2. 0.jar
  • ДЖЕКСОНА-xc.jar

В моем примере я создал следующий класс:

package foo; 

import java.util.*; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class ListWrapper 
{ 
    private List<List<Map<String,String>>> list; 

    public List<List<Map<String,String>>> getList() 
    { 
     return list; 
    } 

    public void setList(List<List<Map<String,String>>> list) 
    { 
     this.list = list; 
    } 
} 

И этот сервлет класс:

package foo; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 


@Path("/foo") 
public class Foo { 

    @GET 
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) 
    public ListWrapper getList() 
    {  
     ListWrapper lw = new ListWrapper(); 

     HashMap<String,String> map = new HashMap<String,String>(); 
     map.put("foo", "bar"); 
     map.put("hello", "world"); 

     ArrayList<Map<String,String>> innerList = new ArrayList<Map<String,String>>(); 
     innerList.add(map); 

     ArrayList<List<Map<String,String>>> outerList = new ArrayList<List<Map<String,String>>>(); 
     outerList.add(innerList); 

     lw.setList(outerList); 
     return lw; 
    } 
} 

Следующий XML был добавлен в сети ,XML-конфигурации в моем приложении:

<servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>foo,com.fasterxml.jackson.jaxrs.json</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 

Запрос сервлет в браузере возвратил следующую JSON:

{ 
    "list": [ 
     [ 
     { 
      "foo": "bar", 
      "hello": "world" 
     } 
     ] 
    ] 
} 

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

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