2014-05-10 12 views
10

Rzućmy okiem na następującym prostym kontrolerem testowym (używane z wiosny 4.0.3):Prosty ciąg jako JSON wartości zwracanej w kontrolerze spoczynkowej sprężyna

@RestController 
public class TestController 
{ 
    @RequestMapping("/getList") 
    public List<String> getList() 
    { 
     final List<String> list = new ArrayList<>(); 
     list.add("1"); 
     list.add("2"); 
     return list; 
    } 

    @RequestMapping("/getString") 
    public String getString() 
    { 
     return "Hello World"; 
    } 
} 

Teoretycznie obie metody kontroler powinien powrócić ważny JSON. Wywołanie pierwsza metoda kontroler rzeczywiście ma zwrócić następujący JSON tablicy:

$ curl -i -H "Accept: application/json" http://localhost:8080/getList 
HTTP/1.1 200 OK 
Content-Type: application/json;charset=UTF-8 

["1","2"] 

ale druga metoda kontrolera Zwraca ciąg bez cudzysłowu, który nie jest prawidłowy ciąg JSON:

$ curl -i -H "Accept: application/json" http://localhost:8080/getString 
HTTP/1.1 200 OK 
Content-Type: application/json;charset=UTF-8 

Hello World 

Dlaczego tak jest? Czy można to skonfigurować? Czy to błąd? Czy funkcja, której nie rozumiem?

+1

Zajrzyj do 'StringHttpMessageConverter', który jest zarejestrowany przed konwerterem jackson. –

Odpowiedz

8

Po zwrocie obiektu String, Spring MVC interpretuje go jako treść do umieszczenia w treści odpowiedzi i nie modyfikuje go dalej. Jeśli chcesz, aby rzeczywisty ciąg znaków był odpowiedzią JSON, musisz albo zacytować go samodzielnie, albo uruchomić bezpośrednio przez Jacksona.

+0

Brzmi dość dziwnie. Zgodnie z nagłówkiem 'Accept' w żądaniu, jedyną poprawną odpowiedzią musi być content-type' application/json', więc Spring musi użyć Jacksona do odpowiedzi, a Jackson powinien stworzyć prawidłowy JSON. W takim przypadku odpowiedź jest po prostu nieważna. Ma typ-treści 'application/json', ale nie został przekonwertowany na JSON. – kayahr

+3

@kayahr Ale co jeśli chciałbyś stworzyć własny ciąg JSON bez Jacksona (może bardzo proste połączenie ciągów)? Wtedy Wiosna musiałaby ponownie przeanalizować twoją odpowiedź, żeby sprawdzić, co się dzieje. 'ResponseBody' oznacza' ResponseBody', który jest ostatecznie ciągiem bajtów, a Spring wykonuje tylko konwersje, jeśli nie może dopasować typów Java, o których mowa; 'String' nie wymaga konwersji. – chrylis

2

Możesz usunąć , który jest zarejestrowany przed konwerterem jackson, - jak wspomniano w komentarzu.

/** 
* Unregister the default {@link StringHttpMessageConverter} as we want 
* Strings to be handled by the JSON converter. 
* 
* Our MappingJackson2HttpMessageConverter will deal with strings. 
* 
* @param converters 
*   List of already configured converters 
*/ 
@Override 
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { 

    Iterator<HttpMessageConverter<?>> iterator = converters.iterator(); 

    while (iterator.hasNext()) { 
     HttpMessageConverter<?> converter = iterator.next(); 

     if (converter instanceof StringHttpMessageConverter) { 
      iterator.remove(); 
     } 
    } 
} 
+0

Ładne rozwiązanie, działa dobrze. –

0

Jeśli chcesz powrócić obiekt String Spring MVC interpretuje to jako zawartość umieścić w organizmie reakcji i nie zmienia go dalej. Jeśli chcesz, aby rzeczywisty ciąg znaków był odpowiedzią JSON, musisz albo zacytować go samodzielnie, albo uruchomić bezpośrednio przez Jacksona.

@RestController 
public class TestController 
{ 
    @RequestMapping("/getString") 
    public String getString() 
    { 
    return JSONObject.quote("Hello World"); 
    } 
} 
0

Oto kroki, które zrobiłem, aby to osiągnąć:

  1. Dodaj zależność w pliku pom:

    <dependency> 
        <groupId>com.fasterxml.jackson.core</groupId> 
        <artifactId>jackson-databind</artifactId> 
        <version>2.9.3</version> 
    </dependency> 
    
  2. Put @ResponseBody adnotacji na metodzie tak:

    @RequestMapping(value = "/getCountries", method = RequestMethod.GET)  
    @ResponseBody  
    public List<Country> getCountries() {  
        return countryDAO.list();  
    } 
    
Powiązane problemy