2013-07-26 12 views
9

Na moim wiosennym serwerze MVC chcę otrzymać żądanie wieloczęściowe/dane formularza zawierające zarówno plik (obraz), jak i niektóre metadane JSON. Potrafię zbudować dobrze sformułowane żądanie wieloczęściowe, gdzie sekcja JSON ma Content-Type=application/json. Usługa Wiosna jest w formie:Dodaj konwerter wiadomości JSON dla wieloczęściowych/formularzy danych

@RequestMapping(value = MY_URL, method=RequestMethod.POST, headers="Content-Type=multipart/form-data") 
public void myMethod(@RequestParam("image") MultipartFile file, @RequestParam("json") MyClass myClass) { 
... 
} 

Plik został poprawnie przesłany, ale mam problemy z części JSON. Otrzymuję ten błąd:

org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'myPackage.MyClass'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [myPackage.MyClass]: no matching editors or conversion strategy found 

Jeśli nie używam wieloczęściowy żądania konwersji za pomocą JSON działa dobrze Jackson 2, ale przy użyciu wieloczęściowy dostaję poprzedni błąd. Myślę, że muszę skonfigurować wieloczęściowy konwerter wiadomości, aby obsługiwał JSON jako część wiadomości, ale nie wiem jak. Oto moja konfiguracja:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" /> 
<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

Wszystko działa dobrze, jeśli mogę użyć jako typ String myClass zamiast MojaKlasa, ale chcą korzystać ze wsparcia Wiosna MVC do konwersji parametrów.

+0

Jestem również stoi podobny problem http://stackoverflow.com/questions/18896648/json-post-spring-mvc-curl-400-bad-request, ale nie ma jeszcze rozwiązania – Pradeep

Odpowiedz

1

Nie mam pojęcia, jak to zrobić, ale wiem, że @RequestParam ("json") MyClass myClass można zmienić na @RequestParam ("json") String myClass i zbuduj klasę obiektu przez JSON przekonwertowany! To nie jest dobre, ale działa

7

Jeśli użyjesz adnotacji @RequestPart zamiast @RequestParam, przekaże ona parametry poprzez konwertery wiadomości. Tak więc, jeśli metodę kontrolera zmiany do następujących, to powinno działać jak możesz opisać:

@RequestMapping(value = MY_URL, method=RequestMethod.POST, headers="Content-Type=multipart/form-data") 
public void myMethod(@RequestParam("image") MultipartFile file, @RequestPart("json") MyClass myClass) { 
... 
} 

Możesz przeczytać więcej na ten temat w podręczniku referencyjnym Wiosna: http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/mvc.html#mvc-multipart-forms-non-browsers