【问题标题】:Spring Web Application Returning 405 error on PUT CallSpring Web 应用程序在 PUT 调用上返回 405 错误
【发布时间】:2019-03-28 16:56:55
【问题描述】:

我有一个 Java Spring Web 应用程序,它创建了一个可以分配给用户的角色列表。但是,我在创建新角色时遇到问题,该角色是通过返回 405 错误的 AJAX PUT 调用调用的。该应用程序在 Java 8 和 Spring 5.1.1 上运行。

我已经尝试调试前端和后端。我发现,调用成功到达后端,处理调用并返回。但是,前端会声称发生了错误并返回 405 错误。但问题是,该错误没有提供任何关于究竟是什么失败的细节。我能找到的信息最多的是这条消息:

TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
    at Function.invokeGetter (<anonymous>:2:14)
    at Object.error (http://localhost:8000/xxx/admin-user-search.html:1011:10)
    at fire (http://localhost:8000/xxxx/webjars/jquery/3.1.1/jquery.js:3305:31)
    at Object.fireWith [as rejectWith] (http://localhost:8000/xxxx/webjars/jquery/3.1.1/jquery.js:3435:7)
    at done (http://localhost:8000/xxxx/webjars/jquery/3.1.1/jquery.js:9244:14)
    at XMLHttpRequest.<anonymous> (http://localhost:8000/xxxx/webjars/jquery/3.1.1/jquery.js:9484:9)

Javascript:

function submitCreateNewRole(){
    isBlank = false;  
    var myData;

     newRoleName = $('#modalUserRoleSearchText').val();
     newRoleDescription = $('#modelUserRoleDescText').val();

     if (newRoleName=='' || newRoleDescription==''){
         isBlank = true;
     }

     if (isBlank){
         appAPI.setErrorBannerRole("Blank data is not allowed. Please enter non-blank data to create new Role.");
     } else {
         var UserRoleSearchModel = {}; 
         var userRoleAction = "createNewUserRole" ;

         RoleModel.ldapName = newRoleName; 
         RoleModel.roleDesc = newRoleDescription;      
         var token = $("meta[name='_csrf']").attr("content");
         var URL = "json/admin-user-search?userRoleAction=" + userRoleAction + "&roleName=" + newRoleName + "&roleDesc=" + newRoleDescription;
         var req = JSON.stringify(RoleModel);
         var jqxhr = $.ajax({               
             type: "PUT",
             url: URL,
             headers: { "X-CSRF-TOKEN" : token },
             data: req,
             contentType: "application/json",
             error: function (xhr, status, error) {
                 console.log("Failure caught");
                 console.log(xhr.responseText);
             },
             success: function(data){
                 myData = data;
             }
         }).done(function( msg ) {
             $('#alertMessageSuccess').val('Successfully create new row');
          }).fail(function(jqxhr) {
          $('#alertMessageError').val('failed to create role' + newRoleName);   
          });
      }  

      return myData; 
 }

Java 弹簧:

 @RequestMapping(value = {
      "admin-user-search"
  }, method = RequestMethod.PUT)
  public ModelAndView createNewUserRole(@AuthenticationPrincipal Principal principal,
      @RequestParam(required = false) String pageCommand,
      @ModelAttribute("UserModel") UserModel userSearch,
      @ModelAttribute("RoleModel") RoleModel userRoleSearch,
      @RequestParam(value = "roleName", required = false) String roleName,
      @RequestParam(value = "roleDesc", required = false) String roleDesc,
      @RequestParam(value = "userRoleAction", required = false) String userRoleCommmand, HttpServletRequest request) {

    Results results = null;
    List<Role> roleVOs = null;
    String roleResponseMessage;

    ModelAndView rView = new ModelAndView("admin-user-search");

    if ("createNewUserRole".equals(userRoleCommmand)) {
      userRoleSearch.clearAlertMessages();
      userSearch.clearAlertMessage();

      if ("".equals(roleName)) {
        roleResponseMessage = "Unable to create a new role due to invalid or blank LDAP username enterred. Please try again with valid LDAP username.";
        userRoleSearch.setErrorMessages(roleResponseMessage);
      } else if ("".equals(roleDesc)) {
        roleResponseMessage = "Unable to create a new role due to invalid or blank Role Description entered.";
        userRoleSearch.setErrorMessages(roleResponseMessage);
      } else {
        try {
          this.tdmcRoleDao.addNewRole(roleName, roleDesc);
          roleResponseMessage = String.format("New user role '%s' has been added.", userRoleSearch.getLdapDn());
          userRoleSearch.setSuccessMessages(roleResponseMessage);
          userSearch.setSuccessMessages(roleResponseMessage);

          roleVOs = retrieveAllRoles();
        } catch (final SQLException e) {
          LOGGER.error(e, TDMCMessages.TDMC_0142_DATABASE_INSERT_EXCEPTION, "tdmcRoleDao.addNewRole(newRoleLdap)");
          roleResponseMessage = "Unable to create a new role -'%s' due to DB problem. Please retry with a new  valid role name.";
          userRoleSearch.setErrorMessages(roleResponseMessage);
          userSearch.setErrorMessages(roleResponseMessage);
        } catch (final DuplicateKeyException dupEx) {
          roleResponseMessage = "Unable to create a duplicate role'. Please retry with non-duplicated role name.";
          userRoleSearch.setErrorMessages(roleResponseMessage);
          userSearch.setErrorMessages(roleResponseMessage);
        }

        if (roleVOs != null && !roleVOs.isEmpty()) {
            results = populateRolesToResults(roleVOs);
        }

        userRoleSearch.setResults(results);
        userRoleSearch.setSelected(roleVOs);

        rView.addObject("RoleModel", userRoleSearch);
      }
    }

    return rView;
}

当我运行应用程序并尝试创建新角色时,我看到 PUT 调用到达 Java 服务器并成功返回视图。但是,在 Web 客户端,它会抛出 405 错误,并且不清楚究竟是什么失败了。任何见解都会非常有帮助。

另一方面,应用程序也发出 POST 和 GET 调用,但这些调用似乎工作正常,所以我不明白为什么在这种情况下 PUT 调用失败。

编辑:修复代码

【问题讨论】:

    标签: javascript java ajax spring-mvc


    【解决方案1】:

    首先,您的网址似乎是错误的,请检查。 并更改为发布映射,然后通过正文发布,某事 喜欢@requesrbody

    【讨论】:

    • 你能澄清你的意思吗?网址似乎有什么问题?你是指requesrbody吗?
    • 将 url 更改为 /admin-user-search
    • 更新后映射的控制器方法,为角色对象创建一个poco,并处理来自@requestbody的这个请求
    猜你喜欢
    • 2015-10-05
    • 2014-09-03
    • 2019-03-28
    • 1970-01-01
    • 2015-02-04
    • 2021-01-10
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    相关资源
    最近更新 更多