gpt4 book ai didi

java - Jackson @ResponseBody 每个方法在 Spring @Controller 上自定义序列化

转载 作者:行者123 更新时间:2023-12-01 06:05:28 30 4
gpt4 key购买 nike

我有一个 Java 枚举:

public enum MyEnum {
FOO("fee", "The fee foo", "lorem ipsum"),
BAR("bee", "The bar bee", "ipsum lorem"),
BAZ("boo", "The baz boo", "blah blah");

private final String id;
private final String summary;
private final String description;

@JsonValue
public String getId() {
return id;
}
}

@JsonValue 是故意的,因为我希望在大多数 JSON 序列化中默认将 id 作为“值”返回(例如 “fee”),但是对于我的其余 Controller ,我想序列化枚举及其所有属性:

@Controller
public class MyEnumController {
@RequestMapping(method = RequestMethod.GET, value = "/my-enum-types", produces = {APPLICATION_JSON_UTF8_VALUE})
@ResponseStatus(HttpStatus.OK)
public @ResponseBody ResponseEntity<MyEnum[]> getMyEnumTypes() {
return ResponseEntity.ok(MyEnum.values());
}

/*
desired output: "[
{
"id": "fee",
"summary: "The fee foo",
"description": "lorem ipsum"
},
...
]"

actual output: "[
"fee",
"bee",
"boo"
]"
*/
}

我尝试使用 @JsonFormat(shape = JsonFormat.Shape.OBJECT) 注释枚举类,但是 @JsonValue 注释似乎覆盖了此配置。从类中删除 @JsonValue 可以解决此问题,但如果我这样做,则包含 MyEnum 属性的每个其他类都需要具有 @JsonFormat(shape = JsonFormat.Shape.String) 获取实际的枚举名称或 @JsonSerialize(using = MyEnumToIdPropertySerialzer.class) 获取原始 @JsonValue 行为(据我所知)。

我还知道可以使用 REST 方式的对象的自定义表示来配置媒体类型(例如 application/vnd.com.example.full_enum+json),但这似乎相当复杂对于一些只会偶尔发生的事情。如果这是最合适的方法,我愿意接受,但我也希望简单地用 @WithCustomSerializer(using = MyEnumSerializer.class, for = MyEnum.class) 之类的东西注释 Controller 方法将使我免于这些配置问题。

是否有一种注释惯用的方式来声明 @Controller 方法以包含每个方法的自定义序列化而不是其默认 (@JsonValue) 类注释行为?

更新:

我认为在之前的回答之后我需要澄清一下,我不希望我的 Controller 返回字符串列表。我希望将其签名保留为 MyEnum 数组,因为它应该是这样。

类上的任何注释都会影响全局的 JSON 序列化,我希望保持其全局表示形式,就像我已经注释该类的方式一样。

最佳答案

请尝试以下代码:

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MyEnum {

FOO("fee", "The fee foo", "lorem ipsum"),
BAR("bee", "The bar bee", "ipsum lorem"),
BAZ("boo", "The baz boo", "blah blah");

@JsonProperty
private final String id;
@JsonProperty
private final String summary;
@JsonProperty
private final String description;

private MyEnum(String id, String summary, String description) {
this.id=id;
this.summary=summary;
this.description=description;
}
}

关于java - Jackson @ResponseBody 每个方法在 Spring @Controller 上自定义序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45830418/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com