从视图中忽略的ModelAttribute(Omit ModelAttribute from vie

2019-09-21 16:25发布

我有一个返回JSON / XML REST应用程序。 我用杰克逊和JAXB转换。 有些方法需要接受一个QUERY_STRING。 我用@ModelAttribute映射到QUERY_STRING一个对象,但这种强制对象变成我的看法。 我不希望对象出现在视图中。

我想我需要使用比其他@ModelAttribute的东西,但我无法弄清楚如何做绑定,但不能修改视图。 如果我省略@ModelAttribute注解,对象出现在视图作为变量名(例如:“sourceBundleRequest”)。

示例URL:

http://localhost:8080/rest/sourcebundles/?updateDate=20100501&label=urgent

控制器的方法:

@RequestMapping(value = {"", "/"}, method = RequestMethod.GET)
public String getAll(@ModelAttribute("form") SourceBundleRequest sourceBundleRequest, BindingResult result, ModelMap model) throws ApiException {
    // Detect and report errors.
    if (result.hasErrors()) {
       // (omitted for clarity)
    }

    // Fetch matching data.
    PaginatedResponse<SourceBundle> sourceBundleResponse = null;
    try {
        int clientId = getRequestClientId();
        sourceBundleResponse = sourceBundleService.get(clientId, sourceBundleRequest);
    } catch (ApiServiceException e) {
        throw new ApiException(ApiErrorType.INTERNAL_ERROR, "sourceBundle fetch failed");
    }

    // Return the response.
    RestResponse<PaginatedResponse> restResponse = new RestResponse<PaginatedResponse>(200, "OK");
    restResponse.setData(sourceBundleResponse);
    model.addAttribute("resp", restResponse);
    // XXX - how do I prevent "form" from appearing in the view?
    return "restResponse";
}

示例输出:

"form": {
    "label": "urgent",
    "updateDate": 1272697200000,
    "sort": null,
    "results": 5,
    "skip": 0
},
"resp": {
    "code": 200,
    "status": "OK",
    "data": {
        "totalAvailable": 0,
        "resultList": [ ]
    }
}

所需的输出:

"resp": {
    "code": 200,
    "status": "OK",
    "data": {
        "totalAvailable": 0,
        "resultList": [ ]
    }
}

省略@ModelAttribute( “形式”)

如果我只是省略@ModelAttribute(“形式”),我仍然得到不良反应,但进入的形式是由对象名称命名。 响应看起来是这样的:

"resp": {
    "code": 200,
    "status": "OK",
    "data": {
        "totalAvailable": 0,
        "resultList": [ ]
    }
},
"sourceBundleRequest": {
    "label": "urgent",
    "updateDate": 1272697200000,
    "sort": null,
    "results": 5,
    "skip": 0
}

Answer 1:

你不需要注释与@ModelAttribute形式,如果你不希望表单也回来看,它会得到干净势必SourceBundleRequest即使没有@ModelAttribute注解。

现在,一个标准的方法来恢复使用Spring MVC是直接返回类型(在你的情况下,一个JSON / XML响应PaginatedResponse用),然后注释方法@ResponseBody ,底层HttpMessageConverter随后将转换响应转换为XML / JSON根据来自客户端的Accept头。

@ResponseBody
public RestResponse<PaginatedResponse> getAll(SourceBundleRequest sourceBundleRequest, BindingResult result, ModelMap model)
...


Answer 2:

不知怎的,我错过了最明显的方式来解决这个问题。 我的重点是属性和忘了,我可以只修改底层地图。

  // Remove the form object from the model map.
  model.remove("form");

这可能是一个小更有效地省略@ModelAttribute作为建议的六必居,然后取出sourceBundleRequest对象。 我怀疑@ModelAttribute有一些额外的开销。



Answer 3:

如何使用@JsonIgnore?

@ModelAttribute("foo")
@JsonIgnore
public Bar getBar(){}

没有测试



文章来源: Omit ModelAttribute from view