J'ai un bean Spring MVC et je voudrais retourner un caractère turc en définissant le codage UTF-8. mais bien que ma chaîne soit "şŞğĞİıçÇöÖüÜ" elle retourne sous la forme "?????? çÇöÖüÜ". et aussi quand je regarde la page de réponse, qui est la page Internet Explorer, le codage est l'iso d'Europe occidentale, pas UTF-8.
Voici le code:
@RequestMapping(method=RequestMethod.GET,value="/GetMyList")
public @ResponseBody String getMyList(HttpServletRequest request, HttpServletResponse response) throws CryptoException{
String contentType= "text/html;charset=UTF-8";
response.setContentType(contentType);
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.setCharacterEncoding("utf-8");
String str="şŞğĞİıçÇöÖüÜ";
return str;
}
Je l'ai compris, vous pouvez ajouter à la requête mappage produire = "text/plain; charset = UTF-8"
@RequestMapping(value = "/rest/create/document", produces = "text/plain;charset=UTF-8")
@ResponseBody
public void create(Document document, HttpServletRespone respone) throws UnsupportedEncodingException {
Document newDocument = DocumentService.create(Document);
return jsonSerializer.serialize(newDocument);
}
voir cet article de blog pour plus de détails sur la solution
dans votre contexte XML servlet de distributeur, vous devez ajouter une propriété "<property name="contentType" value="text/html;charset=UTF-8" />"
sur votre bean viewResolver .
ça ressemble à quelque chose comme ça:
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
...
<property name="contentType" value="text/html;charset=UTF-8" />
...
</bean>
Convertissez vous-même la chaîne JSON en UTF-8.
@RequestMapping(value = "/example.json", method = RequestMethod.GET)
@ResponseBody
public byte[] example() throws Exception {
return "{ 'text': 'äöüß' } ".getBytes("UTF-8");
}
Ajoutez aussi à vos haricots:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<array>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg index="0" name="defaultCharset" value="UTF-8"/>
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
<value>application/x-www-form-urlencoded;charset=UTF-8</value>
</list>
</property>
</bean></bean>
Pour @ExceptionHandler:
enter code<bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
<property name="messageConverters">
<array>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg index="0" name="defaultCharset" value="UTF-8"/>
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
<value>application/x-www-form-urlencoded;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
<value>application/x-www-form-urlencoded;charset=UTF-8</value>
</list>
</property>
</bean>
</array>
</property>
</bean>
Si vous utilisez <mvc:annotation-driven/>
, cela devrait être après les haricots.
Des questions similaires se posent: Problème de codage de réponse Spring MVC , Personnalisez HttpMessageConverter avec @ResponseBody pour effectuer des opérations Json .
Cependant, ma solution simple:
@RequestMapping(method=RequestMethod.GET,value="/GetMyList")
public ModelAndView getMyList(){
String test = "čćžđš";
...
ModelAndView mav = new ModelAndView("html_utf8");
mav.addObject("responseBody", test);
}
et la vue html_utf8.jsp
<%@ page language="Java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>${responseBody}
Aucune classe ni configuration supplémentaire.
Et Vous pouvez également créer une autre vue (par exemple, json_utf8) pour un autre type de contenu.
Lorsque vous essayez d'envoyer des caractères spéciaux tels que è, à, ù, etc., vous verrez peut-être sur votre page Jsp Post de nombreux caractères tels que '£', 'Ä' ou 'Æ' . Pour résoudre ce problème dans 99 % de cas vous pouvez déplacer dans votre web.xml cette partie de code en tête du fichier:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Pour un exemple complet, voir ici: https://lentux-informatica.com/spring-mvc-utf-8-encoding-problem-solved/
J'ai résolu ce problème en déduisant le type de retour généré dans la première requêteProfession GET. La partie importante ici est la
produces="application/json;charset=UTF-8
Ainsi, pour chaque utilisation/compte/**, Spring renverra application/json; charset = type de contenu UTF-8.
@Controller
@Scope("session")
@RequestMapping(value={"/account"}, method = RequestMethod.GET,produces="application/json;charset=UTF-8")
public class AccountController {
protected final Log logger = LogFactory.getLog(getClass());
....//More parameters and method here...
@RequestMapping(value={"/getLast"}, method = RequestMethod.GET)
public @ResponseBody String getUltimo(HttpServletResponse response) throws JsonGenerationException, JsonMappingException, IOException{
ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
try {
Account account = accountDao.getLast();
return writer.writeValueAsString(account);
}
catch (Exception e) {
return errorHandler(e, response, writer);
}
}
Ainsi, vous n'avez pas besoin de configurer chaque méthode de votre contrôleur, vous pouvez le faire pour toute la classe. Si vous avez besoin de plus de contrôle sur une méthode spécifique, il vous suffit de déduire le type de contenu de retour produit.
Si vous utilisez Spring MVC version 5, vous pouvez également définir le codage à l'aide de l'annotation @GetMapping
. Voici un exemple qui définit le type de contenu sur JSON et le type de codage sur UTF-8:
@GetMapping(value="/rest/events", produces = "application/json; charset=UTF-8")
Plus d'informations sur l'annotation @GetMapping ici: