如何让Feign支持Enum的对象!

Enum的序列化!

可对DTO通过alibaba.fastjson的注解来达到序列化的目标,在字段中增加

@JSONField(serialzeFeatures = {SerializerFeature.WriteEnumUsingToString})
private UserTypeEnum userType;

FeignClient调用

当微服务B需要调用微服务A的时候,目前常的可以通过RestTemplate以外最常用的就是OpenFeign的调用了,而在Feign调用时通常会遇到在定义接收对象时,如果对象中有枚举时会抛出异常,无法转换该枚举值,如下例如示:

@FeignClient("haoyu-middle-server")
public interface SystemClient {

    /**
     * 得到系统平台用户信息
     *
     * @param userId 用户id
     * @return 用户信息
     */
    @GetMapping(value = "/middle/api/user/get/{userId}")
    ResultVO<UserDTO> getSysUserById(@PathVariable("userId") Long userId);
}

解决枚举接收问题

当遇到上述问题后,其实解决的办法很简单,共有两种解决办法,分别如下:

方法一、使用JSONObject对象接收

@FeignClient("haoyu-middle-server")
public interface SystemClient {

    /**
     * 得到系统平台用户信息(此处只定义泛型通用返回,具体使用时直接转换DTO即可)
     *
     * @param userId 用户id
     * @return 用户信息
     */
    @GetMapping(value = "/middle/api/user/get/{userId}")
    JSONObject getSysUserById(@PathVariable("userId") Long userId);
}

因为所有Controller的数据返回均是以JSON格式返回的,故而可以不管原先Controller返回的是何种类,都可以使用JSONObject来接收,在调用Client时,只需要进行如下转换即可.

 @Override
 public ResultVO<UserDTO> getSysUserById(Long userId) {
     JSONObject jsonObject = systemClient.getSysUserById(userId);
     ResultVO<UserDTO> resultVO = jsonObject.toJavaObject(ResultVO.class);
     return resultVO;
 }

方法二、直接使用VO泛型对象接收

@FeignClient("haoyu-middle-server")
public interface SystemClient {

    /**
     * 得到系统平台用户信息(此处只定义泛型通用返回,具体使用时直接转换DTO即可)
     *
     * @param userId 用户id
     * @return 用户信息
     */
    @GetMapping(value = "/middle/api/user/get/{userId}")
    ResultVO getSysUserById(@PathVariable("userId") Long userId);
}

此处可直接使用ResultVO来接收,而不具体声明ResultVO,这样就避免了Feign转换成对象,而对象中有含有枚举无法转换的问题了,都是统一当作VO对象来接收,而在具体引用时,可以再声明VO中的具体类,引用示例如下:

 @Override
 public ResultVO<UserDTO> getSysUserById(Long userId) {
     ResultVO<UserDTO> resultVO = systemClient.getSysUserById(userId);
     return resultVO;
 }

在本案中作者采用第二种方法较为常用,减少了不必要的JSON转换。

另附上本例中的Enum的代码示例:

/**
 * 〈用户类型〉
 *
 * @author Allen
 * @date 2020/12/30
 * @since 1.0.0
 */
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum UserTypeEnum implements IBaseEnum<Integer> {
    /**
     * 系统用户
     */
    SYSTEM(1, "系统用户"),
    /**
     * 普通用户
     */
    COMMUNITY(2, "普通用户"),

    /**
     * 其他用户
     */
    INSTALLER(3, "其他用户");

    /**
     * 值
     */
    Integer value;
    /**
     * 描述信息
     */
    String desc;

    /**
     * 架造器
     * @param value 值
     * @param desc 描述信息
     */
    UserTypeEnum(Integer value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    /**
     * 获得枚举值
     * @return 枚举值
     */
    @Override
    public Integer getValue() {
        return value;
    }

    /**
     * 获取描述
     *
     * @return 描述
     */
    @Override
    public String getDesc() {
        return desc;
    }

    /**
     * 得到名称
     *
     * @return 描述信息
     */
    @Override
    public String getName() {
        return this.name();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

apicescn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值