java - 从 Android retrofit2 发布嵌套对象,服务器接收子元素 null
问题描述
使用 Retrofit2 将嵌套对象发布到服务器(SpringFramework)。服务器可以读取第一级属性,但列表属性为空。
检查子元素(列表)在通过 Android 应用程序上的 Retrofit2 发布之前已设置对象。
Android 端(Retrofit2 调用服务器 API):
@POST("rest/upload")
@Headers("Content-Type:application/json; charset=UTF-8")
Call<UploadResponse> uploadRecords(@Body UploadRequest uploadRequest);
Android端(UploadRequest对象):
public class UploadRequest extends AbsRestRequest {
@Expose
List<FlatenAttributesObject> ListOfFlatenAttributesObject;
public List<FlatenAttributesObject> getListOfFlatenAttributesObject() {
return ListOfFlatenAttributesObject;
}
public void setListOfFlatenAttributesObject(List<FlatenAttributesObject> listOfFlatenAttributesObject) {
ListOfFlatenAttributesObject = listOfFlatenAttributesObject;
}
}
Java 服务器端代码(UploadRequest 对象):
public class UploadRequest extends AbsRestRequest {
private ArrayList<FlatenAttributesObject> ListOfFlatenAttributesObject;
}
Java 服务器端代码(控制器):
@RequestMapping(value="/upload", method=RequestMethod.POST, consumes="application/json", produces="application/json")
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public ResponseEntity<UploadResponse> Upload(@RequestBody UploadRequest requestObject) {
UploadResponse response = new UploadResponse();
System.out.println("\t" + requestObject.getActionType() + " \t" + AdmsUtils.date2Str(requestObject.getActionDateTime(), DateFormatConfig.getWebDateTime()));
//String attribute in AbsRestRequest can be read.
System.out.println("\tRecord Count of FlatenAttributesObject: " + (requestObject.getListOfFlatenAttributesObject()==null?0:requestObject.getListOfFlatenAttributesObject().size()));
//Null object for requestObject.getListOfFlatenAttributesObject()
......
return new ResponseEntity<UploadResponse>(response, HttpStatus.OK);
}
为什么 requestObject.getListOfFlatenAttributesObject() 在服务器上读取为空?在发布之前检查对象是否已在 Android 应用程序中设置。(在 Android Studio 调试模式下检查)
解决方案
该问题已得到修复。根本原因在于服务器端编码。类 UploadRequest 中的属性,变量首字母小写。
public class UploadRequest extends AbsRestRequest {
@Expose
List<FlatenAttributesObject> **l**istOfFlatenAttributesObject;
public List<FlatenAttributesObject> getListOfFlatenAttributesObject() {
return **l**istOfFlatenAttributesObject;
}
public void setListOfFlatenAttributesObject(List<FlatenAttributesObject> listOfFlatenAttributesObject) {
listOfFlatenAttributesObject = listOfFlatenAttributesObject;
}
}
“ ListOfFlatenAttributesObject ”的第一个字母导致springframework无法识别属性。它应该是“ listOfFlatenAttributesObject ”并且问题已得到解决。
推荐阅读
- python - 组织包的最 Pythonic 方式是什么
- cordova - Ionic4:如果我们最小化应用程序,则无法获取位置
- java - Android - 如何使用 webview 访问相机
- upgrade - RPM升级后部分文件被删除
- python - 找不到元素 - xPath 正确
- reactjs - React Lazy 如何获取组件?
- sas - SAS 扫描功能分隔符无法正常工作
- angularjs - AngularJS - 指令 - onClick 函数调用 $http(POST) - $http 未定义?
- javascript - javascript - 鼠标点击父元素,但防止它的子元素触发事件
- python - 不包括当前行的滚动窗口