json 序列化, long->string.
怎么让restcontroller (web 前端调用用的), 转string
内部服务之间 feign接口 不转 。
现在有的feign 接口 直接复用的restcontroller
json 序列化, long->string.
怎么让restcontroller (web 前端调用用的), 转string
内部服务之间 feign接口 不转 。
现在有的feign 接口 直接复用的restcontroller
在Spring框架中,如果你想要让RestController
将long
类型的字段序列化为字符串(String
),同时保持Feign客户端调用内部服务时不进行这种转换,你可以通过以下方式实现:
在RestController
中,你可以使用@JsonSerialize
注解来指定long
字段的序列化方式。这通常是通过自定义的序列化器来实现的。但是,对于简单的long
转String
,你可以直接使用com.fasterxml.jackson.databind.ser.std.ToStringSerializer
。
例如:
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
public class MyDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long myLongField;
// getters and setters
}
这样,当RestController
返回这个DTO时,myLongField
将被序列化为字符串。
对于Feign客户端,默认情况下,它会使用与Spring MVC相同的消息转换器(如Jackson)来反序列化响应。但是,由于你希望内部服务之间的调用不将String
反序列化为long
,你可以:
@JsonSerialize
:这样,Feign客户端将不会看到ToStringSerializer
的指示,并会按默认方式处理JSON(即,将字符串反序列化为字符串)。long
类型,你可以在接收DTO中保留String
字段,并在服务层中进行转换。RestController
,你可以使用不同的DTO类。RestController
的DTO包含使用@JsonSerialize
的long
字段,而Feign客户端的DTO包含String
字段。RestController DTO:
public class MyRestControllerDto {
@JsonSerialize(using = ToStringSerializer.class)
private Long myLongField;
// getters and setters
}
Feign Client DTO:
public class MyFeignClientDto {
private String myLongFieldAsString;
// getters and setters
// 如果需要,可以提供一个方法来获取long值(如果确定字符串可以安全地转换为long)
public long getMyLongField() {
return Long.parseLong(myLongFieldAsString);
}
}
这样,你就可以在RestController
和Feign客户端之间保持不同的序列化/反序列化行为。
3 回答2.6k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
8 回答3.6k 阅读
4 回答2.8k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
配置feign的Encoder的实现SpringEncoder,设置HttpMessageConverter的实现MappingJackson2HttpMessageConverter,设置jackson的objectMapper,这个objectMapper不要使用容器里的,自己new一个,默认的就会将long序列化成数字