如何让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();
}
}