假如咱们定义了如下的枚举类,蕴含code和msg两个属性。
package cn.bugkit.serialization.components;import java.security.InvalidParameterException;/** * @author bugkit * @since 2022.2.25 */public enum Result { SUCCESS(0,"SUCCESS"), FAIL(-1,"FAIL"); int code; String msg; Result(int code, String msg) { this.code = code; this.msg = msg; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public static Result valueOf(int code){ Result[] values = values(); for (Result result : values) { if (result.getCode() == code) { return result; } } throw new InvalidParameterException("Invalid Code"); }}
Spring Boot Jackson枚举值默认是通枚举常量的名字来序列化和反序列化的。
假如当初前端要求前后端的通信通过code属性进行。咱们应该怎么做呢?
那就要用到Spring Boot提供的@JsonComponent
注解了。
上面咱们一起看看残缺的实例吧。
首先是controller,提供了入参(反序列化)和后果返回(序列化)的例子。
/** * @author bugkit * @since 2022.2.25 */@RestControllerpublic class EnumController { /** * 入参的result字段是 -1 - fail,后果是0 - success * @param response * @return */ @PostMapping("test") public HttpResponse testSerialize(@RequestBody HttpResponse response) { System.out.println(response); return new HttpResponse(Result.SUCCESS, null); }}
上面咱们看看HttpResponse,蕴含属性result和数据data
/** * @author bugkit * @since 2022.2.25 */public class HttpResponse { private Result result; private Object data; public HttpResponse(Result result, Object data) { this.result = result; this.data = data; } public Result getResult() { return result; } public void setResult(Result result) { this.result = result; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } @Override public String toString() { return "HttpResponse{" + "result=" + result + ", data=" + data + '}'; }}
最初再看看要害的中央,标注Result
所应用的序列化和反序列化类
/** * @author bugkit * @since 2022.2.25 */@JsonComponentpublic class WenSerialization { /** * 序列化,行将Java对象转为JSON,用于将Java对象转为前端所需的后果,此处只传输Result的code字段 */ public static class ResultSerializer extends JsonSerializer<Result> { @Override public void serialize(Result value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeNumber(value.getCode()); } } /** * 反序列化,将JSON转为Java对象,用于接管前端参数 */ public static class ResultDeSerializer extends JsonDeserializer<Result> { @Override public Result deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { ObjectCodec codec = p.getCodec(); JsonNode treeNode = codec.readTree(p); int code = treeNode.intValue(); return Result.valueOf(code); } }}
最初咱们来看看测试后果:
入参
{ "result": -1, "data": "data"}
控制台打印
2022-02-25 10:16:57.583 INFO 1324 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'2022-02-25 10:16:57.584 INFO 1324 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'2022-02-25 10:16:57.584 INFO 1324 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 msHttpResponse{result=FAIL, data=data}
返回后果
{ "result": 0, "data": null}
留神:该形式只针对应用了spring boot自带的jackson才失效。
序列化其余自定义对象也是同理
代码地址:https://github.com/bennetty74...