刘光辉
15 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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);
    }
}