Java Jackson@ResponseBody在Spring@Controller上按方法自定义序列化

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

我有一个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序列化(例如
“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()。请查看中的我的响应,也许这可以帮助您。