package jnpf.config; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.ObjectFactory; import org.springframework.boot.autoconfigure.http.HttpMessageConverters; import org.springframework.cloud.openfeign.support.SpringDecoder; import org.springframework.cloud.openfeign.support.SpringEncoder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import feign.codec.Decoder; import feign.codec.Encoder; /** * Feign 客户端专用的 Jackson 配置:使用默认驼峰命名策略。 *

* jnpf-extend 全局 {@link JacksonConfig} 把 ObjectMapper 配成 SNAKE_CASE * (前端约定的蛇形契约),但其他 jnpf-* 微服务对外 REST 接口仍用驼峰。 * 全局蛇形 mapper 会被 Spring Cloud OpenFeign 默认 Decoder 复用, * 导致 Feign 调 jnpf-permission 等服务时 JSON 字段名映射不上 → entity 字段全 null。 *

* 这里给 Feign 单独装一个驼形 ObjectMapper 的 Decoder/Encoder, * 不影响 MVC 自身对前端的蛇形响应。 */ @Configuration public class FeignClientJacksonConfig { private ObjectMapper feignObjectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return mapper; } @Bean public Decoder feignDecoder() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(feignObjectMapper()); ObjectFactory factory = () -> new HttpMessageConverters(converter); return new SpringDecoder(factory); } @Bean public Encoder feignEncoder() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(feignObjectMapper()); ObjectFactory factory = () -> new HttpMessageConverters(converter); return new SpringEncoder(factory); } }