【问题标题】:(Spring, AngularJS)I don't know why it is NULL(Spring,AngularJS)我不知道为什么它是NULL
【发布时间】:2018-04-02 08:41:10
【问题描述】:

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

这是我的后台控制器

@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()">

当我使用“console.log”检查时,前端控制器可以正确获取用户的电子邮件。 但是在 Back Controller 中,RequestParam 什么都没有,只有 NULL 没有错误代码,除了 'NullPointerException'。

我认为这不是通信错误。 有什么我错过的吗? 谢谢!

【问题讨论】:

  • 嘿@zzangs33,我又回答了。请检查
  • @SangramBadi -- 请不要戳 OP 来检查你的答案。如果它解决了问题,他们显然会赞成/接受它。
  • 当客户端将数据作为对象或字符串 POST 时,服务器会在 RequestBody 而不是 RequestParam 中接收它。使用 RequestBody 并查看您收到的对象。

标签: javascript html angularjs spring


【解决方案1】:

它是您在 Back Controller 中使用的 @RequestParam,因为它链接到请求参数。它应该是链接到 HTTP 请求正文的 @RequestBody。更多信息请查看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
       }
    };

【讨论】:

  • 我将 Object 的 JSON 作为 RequestBody Map 映射发送,然后它就可以工作了!我不知道为什么当我只发送 String 作为 RequestParam 时它不起作用....
  • @zzangs33 对于@RequestParam,您必须将字符串作为请求参数发送,例如./api/v1/public/checkDuplicate?usrEmail=some@email.com
【解决方案2】:

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

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

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

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

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

data: {
  usrEmail: $scope.usrEmail
}

【讨论】:

  • 我尝试在您编写时更改代码,但也没有用。我还尝试将 RequestBody 发送为 map$scope.user.usrEmail = $scope.usrEmail; ~~ data : angular.toJson($scope.user)
  • @zzangs33 -- 有什么错误?您是否尝试将数据设为字符串?
  • public ResponseEntity&lt;Object&gt; getCnt( HttpServletRequest request, HttpServletResponse response, @RequestParam(value="usrEmail", required=false) String usrEmail)
  • var req = { method: 'POST', url: './api/v1/public/checkDuplicate', dataType: 'json', headers: { 'Content-Type': 'application/json; charset=utf-8' }, 'usrEmail' : $scope.usrEmail };
  • 我只更改了 JS 中的代码。但它仍然是 NULL
【解决方案3】:

从 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 传递电子邮件。

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

那么你需要在你的控制器中use @PathValiable('usrEmail')@RequestMapping(value = "/api/v1/public/checkDuplicate/{usrEmail}"

【讨论】:

  • 'usrEmail' : $scope.usrEmail , @RequestParam(value="usrEmail", required=false) String usrEmail)
  • 那么你需要为用户创建一个bean,它可能包含电子邮件的getter setter方法。或者您可以传递来自 URL 的电子邮件,并且可以使用 PathVariable 注释
  • @RequestMapping(value = "/api/v1/doc/list", method = RequestMethod.GET) public ResponseEntity&lt;Object&gt; getList( HttpServletRequest request, HttpServletResponse response, @RequestParam(value="formId", required=false) String formId, @RequestParam(value="currentPage", defaultValue="1", required=false) int currentPage, @RequestParam(value="docTitle", required=false) String docTitle, @RequestParam(value="companyId", required=false) String companyId, @RequestParam(value="order", required=false) String order) 此代码运行良好.. 但我不知道有什么不同。
  • 我将 Object 的 JSON 作为 RequestBody Map 映射发送,然后它就可以工作了!我不知道为什么当我只发送 String 作为 RequestParam 时它不起作用....
【解决方案4】:

您没有在角度中添加查询参数

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多