【问题标题】:Angular 2 http post to Spring MVC (Rest)Angular 2 http 发布到 Spring MVC (Rest)
【发布时间】:2023-04-04 03:57:02
【问题描述】:

我在使用 @RequestParam 到 Spring MVC 的具有多个属性的 angular 2 http post JSON 时遇到问题,但它无法绑定到我的对象,我尝试四处搜索,发现还有另一种使用 @ModelAttribute 但仍然得到的方法同样的结果。以下是我的示例代码:

Angular 2 (http):

this.http.post('api/codetype-create', JSON.stringify(params), { headers: new Headers({ 'Content-Type': 'application/json' }) })
    .toPromise()
    .then(res => res.json().data)
    .catch(this.handleError);

JSON 看起来像这样:

{
  "test": {
    "ctmCode": "11",
    "ctmMaxLevel": 11,
    "ctmDesc": "test"
  },
  "test2": {
    "param1": "abc",
    "param2": "abc",
    "param3": "abc"
  }
}

基本上我正在尝试检索“测试”并绑定到 Spring MVC 中的对象,但它显示为 null。 下面是我的弹簧控制器:

@RestController
@RequestMapping("/api")
public class AppController {
  @Autowired
  Mdc_CodeTypeService mdcCodeTypeService;

  @Transactional
  @RequestMapping(value = {"/codetype-create"}, method = RequestMethod.POST)
  public ResponseEntity<String> postCreateCodeType(ModelMap model, HttpServletRequest request, 
                @RequestParam(value="test",required=false) Mdc_CodeType test) {
    try {
      mdcCodeTypeService.createMdcCodeType(test);
    } catch (Exception ex) {
      return new ResponseEntity< String>("failed", HttpStatus.BAD_REQUEST);
    }
    return new ResponseEntity<String>("Success", HttpStatus.CREATED);
  }
}

更新: Leon 建议使用对象包装器与 JSON 进行映射的替代方法。我将它作为我的第二个选项,但我的目标是使用 Spring 注释仅将“测试”属性映射到我的 Mdc_CodeType 对象,这可能吗?

【问题讨论】:

    标签: json spring spring-mvc angular


    【解决方案1】:

    您需要使用@RequestBody 将请求正文绑定到一个变量。你需要一个物体来捕捉整个身体。

    @RequestMapping(value = {"/codetype-create"}, method = RequestMethod.POST)
    public ResponseEntity<String> postCreateCodeType(ModelMap model, HttpServletRequest request, @RequestBody CompleteRequestBody body ) {
      try {
        mdcCodeTypeService.createMdcCodeType(body.getTest());
      } catch (Exception ex) {
        return new ResponseEntity< String>("failed", HttpStatus.BAD_REQUEST);
      }
      return new ResponseEntity<String>("Success", HttpStatus.CREATED);
    }
    

    CompleteRequestBody 是一个假设的类,它封装了请求中的所有内容。

    【讨论】:

    • 感谢您的回复,但是使用这种方法,我可能需要构建很多类来处理新的帖子数据,或者这是唯一的方法吗?
    • Java 是一种强类型语言,我个人建议为每种类型的请求使用一个具体的类;但是,请记住,您仍然可以使用泛型和多态性来抽象出很多复杂性。或者,您可以将 Object 类型设为 HashMap 并以这种方式访问​​数据,但您会丢失对数据的所有编译检查
    • 请求正文的解组由 spring mvc 自动处理,因此您不必担心。正如上面的答案正确指出的那样,您可以使用将请求有效负载映射到的具体类(并享受强类型代码的好处),也可以使用哈希映射。如果您选择后一种方法,则您需要自己负责从哈希映射中获取所需的数据(您可以将其称为“字符串类型代码”;)
    • 感谢各位的帮助。我将使用@RequestBody 映射对象包装器(具体)方法来处理此类请求。使用 hashmap 真的很痛苦,因为所有值都是字符串类型,因为我也在这个项目中使用休眠框架...感谢您的解决方案:)。
    • 谢谢!这也适用于 JSON 字符串。如果你从你的客户那里传递JSON.stringify(myObj) 之类的东西,你可以用public MyObj update(@RequestBody String json) 之类的东西接收它,然后用new ObjectMapper().readValue(json, MyObj.class) 将它解析回你的MyObj。
    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2016-04-22
    • 2016-08-23
    • 1970-01-01
    相关资源
    最近更新 更多