java文件配置Spring设置StringHttpMessageConverter

来源:互联网 发布:淘宝店如何看宝贝降权 编辑:程序博客网 时间:2024/05/20 03:48

圈内规矩,转载请注明出处,起码标个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@EnableWebMvcpublic 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);    }}
0 0
原创粉丝点击