在 JEE 应用程序中,我使用 GUI 的一些自定义标签字符串创建了一个枚举:
public enum MyThing
{
THING1("Label 1"),
...
THING5("Label 5");
private String label;
private MyThing(String label)
{
this.label = label;
}
...
}
具有此枚举类型属性的对象通过 REST API 进行交付。属性值被序列化为字符串 ID,这就是我所需要的:
具有枚举属性的类:
public class MyBO
{
private MyThing thing;
...
}
服务等级:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
...
@Path("/bos")
public class MyBOsService
{
@GET
@Produces(MediaType.APPLICATION_JSON)
public BO getBO()
{
BO bo = new BO();
...
return bo;
}
}
REST 调用结果:
{"thing":"THING1",...}
太棒了!不过,现在我还想通过不同的 REST 服务类提供完整的 ID 和标签列表:
@Path("/masterdata")
public class MasterDataService
{
@GET
@Produces(MediaType.APPLICATION_JSON)
public MyThing[] allMyThings()
{
return MyThing.values();
}
}
所需的 REST 调用结果:
[{"THING1":"Label 1"},{"THING2":"Label 2"}, ...]
我创建了一个自定义 Jackson JsonSerializer 将枚举值序列化为 id-label 对:
import org.codehaus.jackson.map.JsonSerializer;
...
public class MyThingSerializer extends JsonSerializer<MyThing>
{
@Override
public void serialize(MyThing myThing, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException
{
...
}
}
但是现在,我找不到一个合理的位置来通过 @JsonSerialize 注释附加此 JsonSerializer。如果我将它附加到枚举,例如
@JsonSerialize(using = MyThingSerializer.class)
public enum MyThing{...
所有枚举值都被序列化为 id-label 对,这对于除一个之外的所有 REST 调用都是错误的。
如果我将它附加到应该提供 id-value 对列表的方法,则什么也不会发生:
@Path("/masterdata")
public class MasterDataService
{
@GET
@Produces(MediaType.APPLICATION_JSON)
@JsonSerialize(using = MyThingSerializer.class)
public MyThing[] allMyThings()
{
return MyThing.values();
}
}
REST 调用结果:
["THING1","THING2",...]
我知道我可以将“id-label序列化器”附加到枚举本身,然后附加另一个序列化器,该序列化器再次将默认序列化恢复到枚举的所有其他出现,但是有没有更智能的方法来实现所需的不同在不同地点连载?
最佳答案
您可以使用 @JsonSerialize(using=MySerializer.class) 指定每个属性的自定义序列化程序
。
如果是列表
和数组,您将需要使用:
@JsonSerialize(contentsUsing=MySerializer.class)
因为 using
将取代用于 List
或数组本身的序列化器;对于值,使用不同的序列化器。
关于java - 如何在不同的地方对同一个 Java 枚举使用不同的 Jackson JsonSerializers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29833633/