在接收到的 rest 响应和输出到客户端之间切换字段名称

Switch field names between the received rest response and output to client

我有以下对象,它的值是通过 REST 调用设置的,如下所示。

@Getter
@Setter
public class Benefit {

    @JsonProperty("text")
    private String headerText; // To note, I can't modify this headerText name
}

来自休息电话的数据集。

ResponseEntity<Benefit> response = 
    template.exchange(url, HttpMethod.POST, request, Benefit.class);
Benefit benefit = response.getBody();

其余调用的 return 值采用以下格式,这就是为什么我将其注释为 text.

{
    "text" : "some text"
}

在此之后,使用此响应,我将其作为值传递给呼叫我的客户。
但是当我把信息发下来的时候,我不想把它命名为文本。 我想将其命名为 description。因此我的回复如下:

{
    "description" : "some text"
}

查询/指针
1。有没有办法不用我手动设置就可以做到这一点?
2。此 headerText 用于不同的 REST 调用。在那种情况下,我需要两者
接收值作为 text 并且 return 作为 text。 (因此没有问题)。
3。最好任何可能的解决方案,不应影响以上第 2 点。
4。不过如果有影响就好了。如果有影响第 2 点的解决方案,我将使用全新的 Benefit2 对象来解决此问题。


一种可能的方法是将值设置为另一个变量,然后仅针对特定的 rest 调用将其向下传递。
但是发现很麻烦如下

添加一个名为描述的新字段

@Getter
@Setter
public class Benefit {

    @JsonProperty("text")
    private String headerText;

    // add a new field 
    private String description;
}

休息电话后,执行以下操作:

Benefit benefit = response.getBody();
benefit.setDescription(benefit.getHeadlineText);
benefit.setHeaderText(null);

有什么更好的方法吗?

澄清流程:

  1. 客户调用我的服务

  2. 我的服务调用另一个服务并返回:

    { “文字”:“一些文字” }

  3. 我再return下面回客户端。

    { “描述”:“一些文字” }

讨论后的想法。

打算在两个地方使用此对象,调用 rest 时和 returning 响应客户端时。

@Getter
@Setter
public class TestBenefit extends Benefit {

    @Getter(AccessLevel.NONE)
    @JsonProperty("text")
    private String text;
    
    private String description;

    public void setText(String text) {
        this.description = text;
    }
} 

随着时间的推移,我了解到在这些情况下尝试将一个对象用于多种目的是麻烦多于其价值。您应该创建适当地满足您的请求和响应的对象。如有必要,请使用基数 类。另外,我不会称它为 Benefit2。 :o) 在某种程度上,根据它们的用途命名您的 类。你可以做类似...

class BenefitForOtherPurpose extends Benefit {

   @JsonProperty('description')
   public String getHeaderText() {
     return this.headerText;
   }
}

为此,我认为没有办法使用 Jackson API 来动态调整 @JsonProperty 值,而不是一些反射功夫,同样,可能更多麻烦大于它的价值。在 Jackson API 中我不知道有条件地在这个复杂的解决方案之外设置它:

Conditional JsonProperty using Jackson with Spring Boot