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 配置:使用默认驼峰命名策略。
|
* <p>
|
* jnpf-extend 全局 {@link JacksonConfig} 把 ObjectMapper 配成 SNAKE_CASE
|
* (前端约定的蛇形契约),但其他 jnpf-* 微服务对外 REST 接口仍用驼峰。
|
* 全局蛇形 mapper 会被 Spring Cloud OpenFeign 默认 Decoder 复用,
|
* 导致 Feign 调 jnpf-permission 等服务时 JSON 字段名映射不上 → entity 字段全 null。
|
* <p>
|
* 这里给 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<HttpMessageConverters> factory =
|
() -> new HttpMessageConverters(converter);
|
return new SpringDecoder(factory);
|
}
|
|
@Bean
|
public Encoder feignEncoder() {
|
MappingJackson2HttpMessageConverter converter =
|
new MappingJackson2HttpMessageConverter(feignObjectMapper());
|
ObjectFactory<HttpMessageConverters> factory =
|
() -> new HttpMessageConverters(converter);
|
return new SpringEncoder(factory);
|
}
|
}
|