Java Jackson@ResponseBody在Spring@Controller上按方法自定义序列化
我有一个Java枚举:Java Jackson@ResponseBody在Spring@Controller上按方法自定义序列化,java,spring-mvc,jackson,Java,Spring Mvc,Jackson,我有一个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
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序列化(例如“fee”
)中,id在默认情况下作为“值”返回,但是对于我的rest控制器,我想序列化枚举及其所有属性:
@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"
]"
*/
}
@控制器
公共类MyEnumController{
@RequestMapping(method=RequestMethod.GET,value=“/my enum types”,products={APPLICATION\u JSON\u UTF8\u value})
@ResponseStatus(HttpStatus.OK)
public@ResponseBody ResponseEntity getMyEnumTypes(){
返回ResponseEntity.ok(MyEnum.values());
}
/*
所需输出:“[
{
“id”:“费用”,
总结:“费福”,
“描述”:“lorem ipsum”
},
...
]"
实际产量:“[
“费用”,
“蜜蜂”,
“嘘”
]"
*/
}
我试图用@JsonFormat(shape=JsonFormat.shape.OBJECT)注释enum类
然而,@JsonValue
注释似乎覆盖了此配置。从类中删除@JsonValue可以解决此问题,但如果我这样做,则包含MyEnum
属性的其他每个类都需要@JsonFormat(shape=JsonFormat.shape.String)
获取实际的枚举名称或@JsonSerialize(使用=MyEnumToIdPropertySerialzer.class)
获取原始的@JsonValue
行为(据我所知)
我还知道媒体类型可以通过REST方式的对象自定义表示进行配置(例如,application/vnd.com.example.full_enum+json
),但这似乎只是偶尔发生的事情。如果这是最合适的方法,我愿意接受,但我也希望简单地用类似于@WithCustomSerializer(使用=MyEnumSerializer.class,for=MyEnum.class)的东西来注释控制器方法
将使我免于这些配置难题
是否有一种注释惯用方法来声明@Controller
方法,以包含每个方法的自定义序列化,而不是其默认(@JsonValue
)类注释行为?
更新:
在前面的回答之后,我想我需要澄清,我不希望我的控制器返回字符串列表。我希望它的签名保留为MyEnum
s的数组,因为这是它应该的
该类上的任何注释都将全局影响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;
}
}
当您需要实际的枚举值时,请调用MyEnum.BAR.toString()。请查看中的我的响应,也许这可以帮助您。