【问题标题】:POST array in RequestBody to Spring Controller as List of ObjectsRequestBody 中的 POST 数组作为对象列表发送到 Spring Controller
【发布时间】:2020-09-05 18:25:15
【问题描述】:

我对 Spring 还很陌生,我看过很多关于类似场景的帖子,但我还没有弄清楚这一点。

我正在尝试更改项目中的现有(工作)端点,以将 Region 对象的数组从 Angular 前端传递到 Spring 后端中的列表或其他集合。我的大部分尝试都导致了错误:Bad argument(s) for enum JSON parse error: Cannot deserialize instance of java.util.ArrayList<com.cigna.apps.shapeup.domain.Region> out of START_OBJECT token

这是我的前端 API 调用:

createCampaignReports(apiRoot: HateoasResponse, campaignId: number, regionList: Region[]): Observable<Action> {
    if (hasHref(apiRoot, this.links.reports)) {
      let params: HttpParams = new HttpParams();
      params = params.set('campaignId', campaignId.toString());
      return this.httpClient.post(getHref(apiRoot, this.links.reports), {regionList}, {params: params})

    ...other code...

    }
  }

这是来自我的前端的字符串化示例数组:

[
  {
    "sid": 2,
    "region": "New Zealand"
  },
  {
    "sid": 18,
    "region": "Middle East"
  },
  {
    "sid": 19,
    "region": "Kenya"
  }
]

我的 Spring 控制器:

@PostMapping("/reports")
    ResponseEntity<ApiResponse> generateReports(@RequestParam(value = 'campaignId', required = true) Integer campaignId,
                                                @RequestBody (required = false) List<Region> regionList,
                                                HttpServletRequest request,
                                                HttpServletResponse response) {
...other code...

def user = userService.getUser(userId)
def report = portalService.generateReport(user, campaignId, regionList)

...

最后,我在后端的 Region 类:

class Region extends BaseEntity {

    String region

    int age
}

【问题讨论】:

    标签: java json angular spring spring-mvc


    【解决方案1】:

    您可以为区域列表创建包装类 (DTO),例如:

    public class RegionsRequest {
        private List<Region> regions;
        // getters/setters
    

    相应地更新您的控制器:

    @PostMapping("/reports") 
    ResponseEntity<ApiResponse> generateReports(
        @RequestParam(value = 'campaignId', required = true) Integer campaignId, 
        @RequestBody (required = false) RegionsRequest regions, 
        HttpServletRequest request, 
        HttpServletResponse response) { 
        // other code
    

    【讨论】:

    • 当我尝试这个时,每个传递的 Region 对象在控制台中打印为links: [] 是否有原因?我有潜在的问题吗?
    • @nullpointer 你必须调试这个问题。要了解问题到底出在哪里:前端还是后端。只需在使用正确的 POST 参数更新后使用 Postman 检查后端 -> 如果一切正常,那么前端就会出现问题。
    • 是的,您使用 DTO 的建议很有帮助。谢谢!
    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 2019-01-15
    • 2016-07-25
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2014-06-23
    相关资源
    最近更新 更多