您的位置:首页 > 理论基础 > 计算机网络

java文件配置Spring设置StringHttpMessageConverter

2016-10-27 11:18 246 查看
圈内规矩,转载请注明出处,起码标个CSDN,虽然可能没人转

前言:总是看csdn的文章,吃水不忘挖井人。有的问题csdn上面找不到,加上很多人博客互相转发,百度一搜全是一样的,根本解决不了问题。唉,圈子好乱….

第一次写博客,写的很乱,想看结论直接翻到最下面就好了

这几天遇到一个问题就是@ResponseBody返回字符串时,字符乱码。因为我已经配置了一个全局过滤器设置了utf-8的编码,问题应该在spring转换的问题上。然后上百度一搜,发现是要设置StringHttpMessageConverter,这货默认编码是iso-8859-1,并不是utf-8。网上找资料发现都是xml配置注解的解决方案,就像下面这样

<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>


但是这个是xml配置的写法,我是用java文件配置spring的啊。于是我想当然new了一个bean,就像下面这样

@Bean
public StringHttpMessageConverter StringHttpMessageConverter(){
return new StringHttpMessageConverter(Charset.forName("utf-8"));
}


启动发现并没有什么用,打印日志后发现spring用的bean不是我new的那个bean。

偶然在stackoverflow上面看到这样一句话

<mvc:annotation-driven /> is also @EnableWebMvc
<tx:annotation-driven /> is @EnableTransactionManagement.
<context:component-scan /> is @ComponentScan


原来如此,@EnableWebMvc就想当于
<mvc:annotation-driven />
,于是去看了一下WebMvcConfigurerAdapter的源码,发现有一个configureMessageConverters的方法可以配置。于是重写这个方法,设置编码为utf-8。启动服务器一切正常。源码如下:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/");
viewResolver.setSuffix(".jsp");
viewResolver.setExposeContextBeansAsAttributes(true);
return viewResolver;
}

@Bean
public MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
//设置StringHttpMessageConverter
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
StringHttpMessageConverter shm = new StringHttpMessageConverter(Charset.forName("utf-8"));
converters.add(shm);
}
}


另附我的DispatcherServlet的写法

public class DispatcherServlet extends AbstractAnnotationConfigDispatcherServletInitializer{

@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}

@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
}

@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}

@Override
protected void customizeRegistration(Dynamic registration) {
MultipartConfigElement mConfig = new MultipartConfigElement("D:/ojFile", 524288, 6291456, 0);//TODO,上传路径需要修改
registration.setMultipartConfig(mConfig);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐