假设我们有类似这样一个消息体:
struct RecoRequest {
1:map<string,string> params,
2:string deviceId
}
一、对于普通基本类型:
1、如果deviceId属性设置成required,该字段必填,传输时必然会序列化;
1)客户端不设置,或者设置成客户端request.setDeviceId(null);,会报错:
Caused by: org.apache.thrift.protocol.TProtocolException: Required field 'deviceId' is unset! Struct:RecoRequest(params:{uid=testuid, feedNum=13, req_id=testuid}, deviceId:null)
at com.abc.ceshi.recothrift.model.RecoRequest.validate(RecoRequest.java:389)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args.validate(IPersonalRecoService.java:509)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:566)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:1)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args.write(IPersonalRecoService.java:486)
at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:63)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.send_recommend(IPersonalRecoService.java:82)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.recommend(IPersonalRecoService.java:74)
... 50 more
2)客户端request.setDeviceId("123");,服务端recoRequest.isSetDeviceId();为true
2、如果deviceId属性设置为optional,表示可以不填充、或者填null,并且不填充也不会序列化。
1)客户端不设置,或者设置为null(request.setDeviceId(null);)服务端recoRequest.isSetDeviceId();为false
2)客户端request.setDeviceId("123");,服务端recoRequest.isSetDeviceId();为true
3、如果deviceId属性设置为默认(字段前无标识),表示可以不填充,但一定会序列化;
同optional
二、对于集合类型:
1、map、list等容器类型,且为required:
1)客户端设置时,容器中如果某个元素为null,则会报错:
Caused by: java.lang.NullPointerException
at org.apache.thrift.protocol.TBinaryProtocol.writeString(TBinaryProtocol.java:200)
at com.abc.ceshi.recothrift.model.RecoRequest$RecoRequestStandardScheme.write(RecoRequest.java:477)
at com.abc.ceshi.recothrift.model.RecoRequest$RecoRequestStandardScheme.write(RecoRequest.java:1)
at com.abc.ceshi.recothrift.model.RecoRequest.write(RecoRequest.java:359)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:571)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:1)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args.write(IPersonalRecoService.java:486)
at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:63)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.send_recommend(IPersonalRecoService.java:82)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.recommend(IPersonalRecoService.java:74)
... 50 more
2)客户端不设置(不set)或者设置为null,客户端会报错:
Caused by: org.apache.thrift.protocol.TProtocolException: Required field 'params' is unset! Struct:RecoRequest(params:null, deviceId:123)
at com.abc.ceshi.recothrift.model.RecoRequest.validate(RecoRequest.java:389)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args.validate(IPersonalRecoService.java:509)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:566)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:1)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args.write(IPersonalRecoService.java:486)
at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:63)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.send_recommend(IPersonalRecoService.java:82)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.recommend(IPersonalRecoService.java:74)
... 50 more
3)客户端设置request.setParams(paramMap);,服务端recoRequest.isSetParams();为true
2、map、list等容器类型,设置为默认或者optional:
1)客户端设置时,容器中如果某个元素为null,则会报错:
Caused by: java.lang.NullPointerException
at org.apache.thrift.protocol.TBinaryProtocol.writeString(TBinaryProtocol.java:200)
at com.abc.ceshi.recothrift.model.RecoRequest$RecoRequestStandardScheme.write(RecoRequest.java:477)
at com.abc.ceshi.recothrift.model.RecoRequest$RecoRequestStandardScheme.write(RecoRequest.java:1)
at com.abc.ceshi.recothrift.model.RecoRequest.write(RecoRequest.java:359)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:571)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args$recommend_argsStandardScheme.write(IPersonalRecoService.java:1)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$recommend_args.write(IPersonalRecoService.java:486)
at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:63)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.send_recommend(IPersonalRecoService.java:82)
at com.abc.ceshi.recothrift.service.IPersonalRecoService$Client.recommend(IPersonalRecoService.java:74)
... 50 more
2)客户端不设置(不set)或者设置为null,服务端recoRequest.isSetParams();为false
3)客户端设置request.setParams(paramMap);,服务端recoRequest.isSetParams();为true