【问题标题】:Configuration for RestController Deserializing YAML into pojo Uploaded as raw body?RestController 的配置将 YAML 反序列化为 pojo 作为原始正文上传?
【发布时间】:2019-02-14 20:57:01
【问题描述】:

spring 5 webflux 中以下 spring mvc 代码的等效配置是什么?如何在 webflux 中添加多个转换器?

@Configuration
public class YamlConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new YamlJackson2HttpMessageConverter());
    }
}

final class YamlJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter {
    YamlJackson2HttpMessageConverter() {
        super(new YAMLMapper(), MediaType.parseMediaType("application/x-yaml"));
    }
}

【问题讨论】:

标签: spring spring-mvc spring-boot spring-webflux


【解决方案1】:

我发现如果你只是将YAML HttpMessageConverter注册为一个bean webflux会自动使用它。

【讨论】:

    【解决方案2】:

    我知道这很老了,但是在挖掘并找不到答案之后,我终于能够使用一堆不同的帖子将其拼凑起来,在这里发帖希望对未来的人有所帮助。

    /**
     * Modelled off of Jackson2JsonDecoder
     */
    public class Jackson2YamlDecoder extends AbstractJackson2Decoder {
        public Jackson2YamlDecoder() {
            super(YAMLMapper.builder().build(), new MimeType("application","x-yaml"));
        }
    }
    
    /**
     * Modelled off of Jackson2JsonEncoder
     */
    public class Jackson2YamlEncoder extends AbstractJackson2Encoder {
        @Nullable
        private final PrettyPrinter ssePrettyPrinter;
    
        public Jackson2YamlEncoder() {
            super(YAMLMapper.builder().build(), new MimeType("application","x-yaml"));
            this.ssePrettyPrinter = initSsePrettyPrinter();
        }
    
        private static PrettyPrinter initSsePrettyPrinter() {
            DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
            printer.indentObjectsWith(new DefaultIndenter("  ", "\ndata:"));
            return printer;
        }
    
        @Override
        protected ObjectWriter customizeWriter(ObjectWriter writer, MimeType mimeType, ResolvableType elementType, Map<String, Object> hints) {
            return this.ssePrettyPrinter != null && MediaType.TEXT_EVENT_STREAM.isCompatibleWith(mimeType) && writer.getConfig().isEnabled(SerializationFeature.INDENT_OUTPUT) ? writer.with(this.ssePrettyPrinter) : writer;
        }
    }
    
    @Configuration
    public class WebFluxConfig implements WebFluxConfigurer {
        @Override
        public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
            CodecConfigurer.CustomCodecs customCodecs = configurer.customCodecs();
            customCodecs.registerWithDefaultConfig(new Jackson2YamlDecoder());
            customCodecs.registerWithDefaultConfig(new Jackson2YamlEncoder());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-16
      • 2023-02-08
      • 1970-01-01
      • 2017-08-09
      • 2019-11-08
      • 2018-05-05
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      相关资源
      最近更新 更多