如何仅针对单个端点使用特定格式的元素序列化 EnumSet?

问题描述 投票:0回答:1

假设我有一个简单的枚举:

public enum Foo {
  CONST1("Const1 description"),
  CONST2("Const2 description");

  private final String label;

  private Foo(String label) {
    this.label = label;
  }

  public String getLabel() {
    return label;
  }
  
}

现在我有一个端点,它应该返回所有可能的枚举值,以将其用作前端的下拉列表:

@GetMapping
public ResponseEntity<EnumSet<Foo>> allOfFoo() {
  return ResponseEntity.ok(EnumSet.allOf(Foo.class));
}

我想自定义如何返回此枚举元素的格式仅针对此端点(因为在服务的不同位置我可能不需要每个常量的描述),如下所示:

[
  {
    "name": "CONST1",
    "description": "Const1 description"
  },
  {
    "name": "CONST2",
    "description": "Const2 description"
  }
]

Jackson 注释,例如

@JsonProperty
@JsonValue
等似乎需要更改类本身,但我不想更改整个类的序列化格式。
我知道当 EnumSet 包装在另一个对象中时我已经成功使用了
@JsonSerialize
,但我不确定是否可以使其与控制器方法一起使用。
我知道有混合插件,但它们似乎再次改变了枚举格式本身,而不仅仅是特定的 API。
有办法做到吗? 我错过了什么吗?也许这不是一般 API 设计中的问题,而我正在尝试解决错误的问题?

spring spring-boot spring-mvc jackson jackson-databind
1个回答
0
投票

更简单的方法怎么样:

让我们创建一个类:

public class FooDto {

@NotNull
private final Foo foo;

public FooDto(Foo foo) {

 this.foo = foo;

}

public String getName() {
 return foo.name();
}

public String getDescription() {
 return foo.getLabel();
}

}

然后在控制器中:

@GetMapping
public ResponseEntity<Set<FooDto>> allOfFoo() {
  return ResponseEntity.ok(EnumSet.allOf(Foo.class).stream().map(f -> new FooDto(f)).collect(Collectors.toSet());
}

© www.soinside.com 2019 - 2024. All rights reserved.