首页 > 解决方案 > 从 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 调试模式下检查)

标签: javaandroidpostretrofit2nested-object

解决方案


该问题已得到修复。根本原因在于服务器端编码。类 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 ”并且问题已得到解决。


推荐阅读