【问题标题】:Spring boot MVC does not use the specified custom StringHttpMessageConverterSpring boot MVC 不使用指定的自定义 StringHttpMessageConverter
【发布时间】:2015-09-17 09:06:56
【问题描述】:

在负责应用配置的类中是这样的代码:

@Bean
public HttpMessageConverter<String> createStringHttpMessageConverter() {

    StringHttpMessageConverter converter = new StringHttpMessageConverter
            (Charset.forName("UTF-8"));

    return converter;
}

我在调试器中检查了它实际上已执行,并尝试了将StringHttpMessageConverter 作为返回类型的替代方法。

但是,当我调试 WebMvcConfig.extendMessageConverters() 时,我看到使用了具有默认字符集的 StringHttpMessageConverter,而不是使用 UTF-8 字符集的转换器。

为什么 Spring Boot 不使用指定的StringHttpMessageConverter

我知道解决方法可能是在WebMvcConfig.extendMessageConverters() 中根据我的需要更改转换器列表,但我想以正确的方式进行

【问题讨论】:

    标签: java spring-mvc spring-boot


    【解决方案1】:

    使用 Spring Boot try to register array of HttpMessageConverters:

    import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
    import org.springframework.context.annotation.*;
    import org.springframework.http.converter.*;
    
    @Configuration
    public class MyConfiguration {
    
        @Bean
        public HttpMessageConverters customConverters() {
            HttpMessageConverter<?> additional = ...
            HttpMessageConverter<?> another = ...
            return new HttpMessageConverters(additional, another);
        }
    
    }
    

    或者如果你没有使用Spring Boot的自动配置,你可以使用标准的Spring WebMvcConfigurer for registering converters

    @Configuration
    @EnableWebMvc
    public class WebConfiguration extends WebMvcConfigurerAdapter {
    
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
                    .indentOutput(true)
                    .dateFormat(new SimpleDateFormat("yyyy-MM-dd"))
                    .modulesToInstall(new ParameterNamesModule());
            converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
            converters.add(new MappingJackson2XmlHttpMessageConverter(builder.xml().build()));
        }
    
    }
    

    【讨论】:

    • 在这里使用 @EnableWebMvc 可能不是一个好主意,因为它会禁用 Spring Boot 的 Spring MVC 自动配置。您的第一个建议是使用自定义 HttpMessageConverters bean,这就是我的建议。
    • 我更新了我的答案。我包括了第二个选项,因为我正在处理项目,在迁移到 Spring Boot 后的第一天我们无法打开自动配置。需要进行一些迭代来重构旧配置以进行自动配置。因此,我认为不应该期望 Spring Boot 使用自动配置。
    【解决方案2】:

    支持 utf-8 StringHttpMessageConverter 需要 2 个步骤; 首先添加StringHttpMessageConverter;其次在produces中指定charset,代码如下;

    @RestController
    @RequestMapping(value = "/plain")
    public class PlainController {
    
        @RequestMapping(value = "/test", method = RequestMethod.GET,
                produces = {"text/plain;charset=UTF-8"})
        public Response<String> test() {
    
            return new Response<String>("success");
        }
    }
    
        @Bean
        public HttpMessageConverters fastJsonHttpMessageConverters() {
            FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
            FastJsonConfig fastJsonConfig = new FastJsonConfig();
            fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
            fastConverter.setFastJsonConfig(fastJsonConfig);
            HttpMessageConverter<?> converter = fastConverter;
    
            StringHttpMessageConverter stringHttpMessageConverter =
                    new StringHttpMessageConverter(Charset.forName("UTF-8"));
            return new HttpMessageConverters(converter, stringHttpMessageConverter);
        }
    

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 2018-12-06
      • 2017-06-21
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 2018-05-06
      相关资源
      最近更新 更多