假设我有一个简单的枚举:
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
等似乎需要更改类本身,但我不想更改整个类的序列化格式。@JsonSerialize
,但我不确定是否可以使其与控制器方法一起使用。更简单的方法怎么样:
让我们创建一个类:
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());
}