Mam w mojej aplikacji internetowej Spring MVC Java opartej na adnotacjach uruchomionej na serwerze internetowym jetty (obecnie we wtyczce maven jetty).
Próbuję zrobić wsparcie AJAX z jedną metodą kontrolera zwracającą tylko tekst pomocy typu String. Zasoby są w kodowaniu UTF-8, podobnie jak łańcuch, ale moja odpowiedź z serwera jest dołączona
content-encoding: text/plain;charset=ISO-8859-1
nawet gdy moja przeglądarka wysyła
Accept-Charset windows-1250,utf-8;q=0.7,*;q=0.7
Jakoś używam domyślnej konfiguracji sprężyny
Znalazłem wskazówkę, aby dodać tę fasolę do konfiguracji, ale myślę, że po prostu nie jest używana, ponieważ mówi, że nie obsługuje kodowania i zamiast tego używana jest domyślna.
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/plain;charset=UTF-8" />
</bean>
Mój kod kontrolera to (zauważ, że ta zmiana typu odpowiedzi nie działa dla mnie):
@RequestMapping(value = "ajax/gethelp")
public @ResponseBody String handleGetHelp(Locale loc, String code, HttpServletResponse response) {
log.debug("Getting help for code: " + code);
response.setContentType("text/plain;charset=UTF-8");
String help = messageSource.getMessage(code, null, loc);
log.debug("Help is: " + help);
return help;
}
DispatcherServlet
's config (...-servlet.xml
)Znalazłem rozwiązanie dla Spring 3.1. z użyciem adnotacji @ResponseBody. Oto przykład kontrolera używającego wyjścia Json:
źródło
<mvc:annotation-driven/>
w applicationContext. (Zamiast tego<bean class=" [...] DefaultAnnotationHandlerMapping"/>
, co i tak jest przestarzałe w wersji Spring 3.2 ...)produces
atrybutu.MediaType.APPLICATION_JSON_UTF8_VALUE
.Zauważ, że w Spring MVC 3.1 możesz użyć przestrzeni nazw MVC do skonfigurowania konwerterów komunikatów:
Lub konfiguracja oparta na kodzie:
źródło
Accept-Charset
nagłówkiem, który prawdopodobnie zawiera wszystkie znane kodowania znaków, oraz 2) gdy żądanie maAccept
nagłówek,supportedMediaTypes
właściwość konwertera nie jest używana , więc na przykład gdy wykonuję żądanie wpisując bezpośrednio adres URL w przeglądarce odpowiedź maContent-Type: text/html
zamiast tego nagłówek.<bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8" /></bean>
Na wszelki wypadek możesz również ustawić kodowanie w następujący sposób:
Myślę, że użycie StringHttpMessageConverter jest lepsze niż to.
źródło
the manifest may not be valid or the file could not be opened.
w IE 11. Dzięki digz!możesz dodaćsters = "text / plain; charset = UTF-8" do RequestMapping
zobacz ten blog, aby uzyskać więcej informacji
źródło
Niedawno walczyłem z tym problemem i znalazłem znacznie lepszą odpowiedź dostępną na wiosnę 3.1:
Tak więc, tak proste, jak JAX-RS, tak jak wszystkie komentarze wskazywały, że może / powinno być.
źródło
produces
mówi: "... żądanie jest mapowane tylko wtedy, gdy typ zawartości pasuje do jednego z tych typów mediów." co oznacza AFAIK, żeproduces
ma znaczenie dla tego, czy metoda pasuje do żądania, a nie jak typ zawartości powinna mieć odpowiedź.Możesz użyć produkcji, aby wskazać typ odpowiedzi, którą wysyłasz z kontrolera. To słowo kluczowe "produkuje" będzie najbardziej przydatne w żądaniu Ajax i było bardzo pomocne w moim projekcie
źródło
Dzięki digz6666, Twoje rozwiązanie działa dla mnie z niewielkimi zmianami, ponieważ używam json:
Odpowiedź udzielona przez axtavt (którą poleciłeś) nie zadziała dla mnie. Nawet jeśli dodałem właściwy typ nośnika:
źródło
Ustawiam typ zawartości w MarshallingView w fasoli ContentNegotiatingViewResolver . Działa łatwo, czysto i płynnie:
źródło
Używam CharacterEncodingFilter, skonfigurowanego w web.xml. Może to pomoże.
źródło
forceEncoding=true
temu również filtruje odpowiedź, ale w tym przypadku nie pomoże.forceEncoding=false
. Po prostu ustawiłem go nafalse
i „charset = UTF-8” został pomyślnie dodany doContent-Type
nagłówka.jeśli żadne z powyższych nie zadziałało, spróbuj wykonać żądania AJAX na "POST", a nie "GET", to działało dla mnie dobrze ... żadne z powyższych nie zadziałało. Mam również characterEncodingFilter.
źródło
Po wypróbowaniu wielu sposobów obejścia tego problemu ... Przemyślałem to i działa dobrze.
źródło
Prosty sposób rozwiązania tego problemu w Spring 3.1.1 jest następujący: dodaj następujące kody konfiguracji w
servlet-context.xml
Nie musisz niczego zastępować ani wdrażać.
źródło
jeśli zdecydujesz się rozwiązać ten problem za pomocą następującej konfiguracji:
powinieneś potwierdzić, że w całym pliku * .xml powinien znajdować się tylko jeden tag oparty na adnotacjach mvc:. w przeciwnym razie konfiguracja może nie być skuteczna.
źródło
Zgodnie z odsyłaczem „Jeśli kodowanie znaków nie jest określone, specyfikacja serwletu wymaga użycia kodowania ISO-8859-1”. Jeśli używasz wiosny 3.1 lub nowszej, użyj poniższej konfiguracji, aby ustawić charset = UTF-8 na treść odpowiedzi
@RequestMapping (value = "twój adres URL mapowania", produkuje = "tekst / zwykły; charset = UTF-8")
źródło
Przykładowa konfiguracja:
źródło