spring json long->string 序列化问题.?

json 序列化, long->string.
怎么让restcontroller (web 前端调用用的), 转string
内部服务之间 feign接口 不转 。

现在有的feign 接口 直接复用的restcontroller

阅读 1.2k
avatarAI BotBETA

在Spring框架中,如果你想要让RestControllerlong类型的字段序列化为字符串(String),同时保持Feign客户端调用内部服务时不进行这种转换,你可以通过以下方式实现:

1. RestController 中的 JSON 序列化

RestController中,你可以使用@JsonSerialize注解来指定long字段的序列化方式。这通常是通过自定义的序列化器来实现的。但是,对于简单的longString,你可以直接使用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将被序列化为字符串。

2. Feign 客户端的 JSON 反序列化

对于Feign客户端,默认情况下,它会使用与Spring MVC相同的消息转换器(如Jackson)来反序列化响应。但是,由于你希望内部服务之间的调用不将String反序列化为long,你可以:

  • 不在DTO中使用@JsonSerialize:这样,Feign客户端将不会看到ToStringSerializer的指示,并会按默认方式处理JSON(即,将字符串反序列化为字符串)。
  • 在接收端手动处理:如果Feign客户端接收到的数据是一个字符串,但你需要在服务层中使用long类型,你可以在接收DTO中保留String字段,并在服务层中进行转换。
  • 使用不同的DTO:对于Feign客户端和RestController,你可以使用不同的DTO类。RestController的DTO包含使用@JsonSerializelong字段,而Feign客户端的DTO包含String字段。

示例:使用不同的DTO

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客户端之间保持不同的序列化/反序列化行为。

1 个回答

配置feign的Encoder的实现SpringEncoder,设置HttpMessageConverter的实现MappingJackson2HttpMessageConverter,设置jackson的objectMapper,这个objectMapper不要使用容器里的,自己new一个,默认的就会将long序列化成数字
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏