当前位置: 首页 > 后端技术 > Java

【SpringBoot】如何处理前后端枚举值的序列化

时间:2023-04-01 23:21:27 Java

假设我们定义如下枚举类,包括code和msg两个属性。packagecn.bugkit.serialization.components;importjava.security.InvalidParameterException;/***@authorbugkit*@since2022.2.25*/publicenumResult{SUCCESS(0,"SUCCESS"),FAIL(-1,"失败”);内部代码;字符串消息;结果(intcode,Stringmsg){this.code=code;this.msg=味精;}publicintgetCode(){返回代码;}publicvoidsetCode(intcode){this.code=code;}publicStringgetMsg(){返回消息;}publicvoidsetMsg(Stringmsg){this.msg=msg;}publicstaticResultvalueOf(intcode){Result[]values=values();for(Resultresult:values){if(result.getCode()==code){返回结果;}}thrownewInvalidParameterException("无效代码");}}SpringBootJackson枚举值默认以枚举常量名称进行序列化和反序列化。假设现在前端需要通过code属性进行前端与前端之间的通信。我们应该做什么?然后使用SpringBoot提供的@JsonComponent注解。让我们看一个完整的例子。首先是控制器,它提供了输入参数(反序列化)和结果返回(序列化)的例子。/***@authorbugkit*@since2022.2.25*/@RestControllerpublicclassEnumController{/***输入的结果字符串是-1-失败,结果是0-成功*@paramresponse*@return*/@PostMapping("test")publicHttpResponsetestSerialize(@RequestBodyHttpResponseresponse){System.out.println(response);返回新的HttpResponse(Result.SUCCESS,null);}}下面我们看HttpResponse,包含属性result和数据/***@authorbugkit*@since2022.2.25*/publicclassHttpResponse{privateResultresult;私有对象数据;publicHttpResponse(Resultresult,Objectdata){this.result=result;这个。数据=数据;}publicResultgetResult(){返回结果;}publicvoidsetResult(Resultresult){this.result=result;}publicObjectgetData(){返回数据;}publicvoidsetData(Objectdata){this.data=data;}@OverridepublicStringtoString(){返回"HttpResponse{"+"result="+result+",data="+data+'}';}}最后看重点,标记Result/***@authorbugkit*@since2022.2.25*/@JsonComponentpublicclassWenSerialization{/***序列化,即转JavaobjectstoJSON,用于将Java对象转换为前端需要的结果。这里只传输结果代码字段*/publicstaticclassResultSerializerextendsJsonSerializer{@Overridepublicvoidserialize(Resultvalue,JsonGeneratorgen,SerializerProviderserializers)throwsIOException{gen.writeNumber(value.getCode());}}/***反向序列化,将JSON转为Java对象接收前端参数*/publicstaticclassResultDeSerializerextendsJsonDeserializer{@OverridepublicResultdeserialize(JsonParserp,DeserializationContextctxt)throwsIOException,JacksonException{ObjectCodeccodec=p.getCodec();JsonNode树节点=代码c.readTree(p);intcode=treeNode.intValue();返回Result.valueOf(代码);}}}最后来看看测试结果:输入参数{"result":-1,"data":"data"}consoleprint2022-02-2510:16:57.583INFO1324---[nio-8080-exec-2]o.a.c.c.C.[Tomcat].[localhost].[/]:初始化SpringDispatcherServlet'dispatcherServlet'2022-02-2510:16:57.584INFO1324---[nio-8080-exec-2]o.s.web.servlet.DispatcherServlet:正在初始化Servlet'dispatcherServlet'2022-02-2510:16:57.584INFO1324---[nio-8080-exec-2]o.s.web.servlet.DispatcherServlet:在0msHttpResponse中完成初始化{result=FAIL,data=data}returnresult{"result":0,"data":null}注意:该方法只对其他自定义对象进行序列化,对于springboot自带的jackson也是一样的。代码地址:https://github.com/bennetty74...