(Spring,AngularJS)我不知道为什么它是NULL

时间:2018-04-02 08:41:10

标签: javascript html angularjs spring

我想发送用户的电子邮件以检查重复

这是我的后台控制器

@RequestMapping(value = "/api/v1/public/checkDuplicate", method = RequestMethod.POST)
public ResponseEntity<Object> getCnt(
        HttpServletRequest request,
        HttpServletResponse response,
        @RequestParam(value="usrEmail", required=false) String usrEmail){
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}

这是我的前端控制器

$scope.user.usrEmail = $scope.usrEmail;
var req = {
    method: 'POST',
    url: './api/v1/public/checkDuplicate',
    dataType: 'json',
    headers: { 
        'Content-Type': 'application/json; charset=utf-8'
    },
    data: angular.toJson($scope.usrEmail)
};

这是我的观点

<input type="email" class="form-control" name="usr_Email"
       ng-model="usrEmail" ng-required="true" 
       ng-keypress="checkDuplicate()">

当我使用&#39; console.log&#39;进行检查时,Front Controller可以正常收到用户的电子邮件。 但是在Back Controller中,RequestParam没有任何内容,只有没有错误代码的NULL,除了&#39; NullPointerException&#39;。

我认为这不是通讯错误。 我错过了什么吗? 谢谢!

4 个答案:

答案 0 :(得分:1)

请阅读$http配置对象的docs。对于关键数据,它说:

  

data – {string|Object} - 要作为请求消息数据发送的数据。

这意味着data可以是对象或字符串。在您的情况下,您将其作为字符串发送,这是有道理的,但您忘了提及其中的参数名称。代码中的data应如下所示:

data: 'usrEmail=' + $scope.usrEmail // there is no need of angular.toJson here

这正确地将参数的名称表示为usrEmail。但为了避免混淆,您始终可以使用对象来指定数据:

data: {
  usrEmail: $scope.usrEmail
}

答案 1 :(得分:1)

从angularjs发送您的数据,如下所示

$scope.user.usrEmail = $scope.usrEmail;
    var req = {
        method: 'POST',
        url: './api/v1/public/checkDuplicate',
        dataType: 'json',
        headers: { 
            'Content-Type': 'application/json; charset=utf-8'
        },
        data: {
             'usrEmail' : $scope.usrEmail
       }
    };

当您从正文传递数据时,请使用RequestBody注释来获取电子邮件。并需要为用户创建一个Bean类。

@RequestMapping(value = "/api/v1/public/checkDuplicate", method = RequestMethod.POST)
public ResponseEntity<Object> getCnt(
        HttpServletRequest request,
        HttpServletResponse response,
        @RequestBody User usrEmail){
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}

如果您想使用PathVariable,则需要在angularjs中传递来自您网址的电子邮件。

 url: './api/v1/public/checkDuplicate/'+$scope.usrEmail

然后您需要在控制器中use @PathValiable('usrEmail')@RequestMapping(value = "/api/v1/public/checkDuplicate/{usrEmail}"

答案 2 :(得分:1)

它在Back Controller中使用的@RequestParam因为它与请求参数链接。它应该是@RequestBody,它链接到HTTP请求正文。查看here了解详情。

现在您可以更改下面的代码 -

后退控制器

    @RequestMapping(value = "/api/v1/public/checkDuplicate", method = RequestMethod.POST)
    public ResponseEntity<Object> getCnt(
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestBody Object userReqObj){
            HashMap<String, Object> userMap = (HashMap<String, Object>) userReqObj;
            String userEmail = userMap.get("usrEmail");
            //logic goes here...
    }

前置控制器

var req = {
        method: 'POST',
        url: './api/v1/public/checkDuplicate',
        dataType: 'json',
        headers: { 
            'Content-Type': 'application/json'
        },
        data: {
             'usrEmail' : $scope.usrEmail
       }
    };

答案 3 :(得分:0)

您没有在角度

中添加查询参数
     url: './api/v1/public/checkDuplicate?**usrEmail='+$scope.usrEmail**

将此内容添加到您的代码中?usrEmail ='+ $ scope.usrEmail