Spring MVC,错误代码405,方法不允许

时间:2018-03-29 14:41:11

标签: ajax jsp spring-mvc

当我尝试使用我的jsp中的spring mvc和ajax尝试更新数据库中的数据时,我在控制台中得到了这个。

http://localhost:8080/my_project/activerutilisateur/user 405 (Méthode Non Autorisée)

请参阅下面的代码:

DAO

public Utilisateur updateUtilisateur(Utilisateur utilisateur) {
    sessionFactory.getCurrentSession().update(utilisateur);
    return utilisateur;
}

控制器

@RequestMapping(value="/activerutilisateur/{username}", method=RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Utilisateur activerUtilisateur(@PathVariable String username, @RequestBody Utilisateur utilisateur) {
    utilisateur = service.getUtilisateurById(username);
    utilisateur.setEnable(true);
    return service.updateUtilisateur(utilisateur);
}

Ajax请求

<script>
      function activerUtilisateur(username) {

          var user = {"username" : username}

          $.ajax({
              contentType: 'application/json',
              type: 'POST',
              url: 'activerutilisateur/',
              data : JSON.stringify(user),

              error: function(xhr,error,textStatus){
                  console.log(textStatus);
              },

              complete: function(data) {
                  console.log(data);
                  console.log('complete done');
              },

              success: function(data) {
                  alert('success done');
              }
          });
      }   
    </script>

这是唯一不在项目中工作的方法

有人可以帮我找到我做错的事吗?

由于

3 个答案:

答案 0 :(得分:1)

您的控制器是POST方法,但您正在读取pathVariable而不是任何请求正文,通常在POST调用中您需要将Payload发送到您的控制器。在Ajax中,你正在传递

url: 'activerutilisateur/'+username ----&gt; for PathVariable

data: {'username' : username} ----&gt; Controller中没有requestBody用于此有效负载。

您应该更新控制器以将请求正文作为参数。

编辑:我在代码下运行,并且在本地计算机上运行正常

JSP / JS代码:

<script>
      function activerUtilisateur(username) {

          var user = {
                   "username" : username
                     }
                    $.ajax({
                        contentType: 'application/json',
                        type: 'POST',
                        url: 'activerutilisateur/',
                        data : JSON.stringify(user),
                        error: function(data){
                            console.log('Motif erreur : '+data);
                        },
                        complete: function(data) {
                            console.log('complete done');
                        },
                        success: function(data) {
                            console.log('success done');
                        }
                    });
      }   
    </script>

控制器代码:

    @RequestMapping(value = "/activerutilisateur/", method = RequestMethod.POST)
    @ResponseBody
    public Utilisateur activerUtilisateur(@RequestBody Utilisateur user) {

        service.activerUtilisateur(username);
        return user;
    }

型号代码:

public class Utilisateur {

    private String username ;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

此外,您似乎已启用了csrf保护,因此请检查Sending CSRF Token from JS是否在对控制器的调用中发送csrf令牌。

答案 1 :(得分:1)

答案 2 :(得分:0)

我想这是你的Utilisateur模型类:

public class Utilisateur {
    private String username ;
    // getter & setter

}

在您的控制器中:

@RequestMapping(value="/activerutilisateur/", method=RequestMethod.POST)
    @ResponseBody
    public Utilisateur activerUtilisateur(@RequestBody Utilisateur user) {
        return service.activerUtilisateur(user.getUsername());
    }

在您的Ajax呼叫中:

<script type="text/javascript">
            function activerUtilisateur(username){
              var user = {
               "username" : username
                 }
                $.ajax({
                    type: 'POST',
                    url: 'activerutilisateur/',
                    data : JSON.stringify(user)
                    error: function(xhr, error, textStatus){
                        console.log('Motif erreur : '+textStatus);
                    },

                    success:function(data){
                        console.log(data);
                    }
                });
            }   
        </script>