【问题标题】:Request method 'DELETE' not supported in SpringSpring 不支持请求方法“DELETE”
【发布时间】:2014-09-09 19:02:18
【问题描述】:

我正在尝试通过角度服务访问休息方法。这是我的其余方法的代码。

@RestController
@RequestMapping("/api")
public class UserController { 

  @RequestMapping(value ="/removeUserRole/{roleId}", method = RequestMethod.DELETE)
    public void removeUserRole(@PathVariable("roleId")Long roleId){
        System.out.println("inside delete method");
    }

}

这是我的 angularJs 服务方法。

App.factory('manageRoleService', ['$resource',
    function($resource) {
        return {
            getUserRoleDetails: $resource('api/getUserRoleDetails', {}, {
                query: {method: 'GET', isArray: true}
            }),
            removeUserRole: $resource('api/removeUserRole/:roleId', {}, {
                delete: {method: 'DELETE', params: {id: '@roleId'}}
            })
        };
    }]);

get 方法工作正常。但是当我尝试调用 delete 方法时,它会出现以下错误。

405 方法不允许

不支持请求方法“DELETE”

我在这里做错了什么。我尝试在同一问题上关注一些线程,但没有任何帮助。

提前致谢。

【问题讨论】:

  • 请显示,作为来自服务器的 StackTrace 关于此事。如果您打开 MVC 的 INFO 日志记录级别并在此处也显示日志,那就太好了。
  • 这是服务器日志中打印的内容 15:20:01,603 WARN [org.springframework.web.servlet.PageNotFound] (default task-27) Request method 'DELETE' not supported
  • 您可能希望将 org.springframework.web.servlet 的日志级别用于调试甚至跟踪,看看是否有任何奇怪的映射打印在那里。

标签: angularjs spring


【解决方案1】:

在您的 DELETE 网址模板中,您使用的是 :roleId 占位符,但后来提供了 id 变量名。

由于最后一个/ 之后的部分为空,Spring 无法找到正确的映射。

改变

 {id: '@roleId'}

到:

 {roleId: '@roleId'}

假设 @roleId 指的是您拥有的数据对象的属性 - 也许它应该只是 @id

【讨论】:

  • 嗨,我尝试按照您提到的那样更改它,但得到了同样的错误。然后我继续并将其参数名称更改为 id.但仍然得到相同的错误。 removeUserRole: $resource('api/removeUserRole/:id', {}, { delete: {method: 'DELETE', params: {id: '@id'}} })
  • @ChathruakaWaas 您的 GET 处理程序在哪里?在同一个班?请张贴。还请查看您的浏览器控制台并检查 DELETE 请求发送到的 url。另一种选择可能是使用 curl 进行测试。
【解决方案2】:

我玩了一下就解决了。我猜这是 url 模式之间的不匹配。

这是我的新代码。

@RestController
@RequestMapping("/api/role")
public class RoleController {

    private static final Logger logger = LoggerFactory.getLogger(RoleController.class);

    @Autowired
    private RoleService roleService;

    @RequestMapping(method = RequestMethod.GET)
    public List<ModulePermission> getAllRoles(){
        return roleService.getModulePermissions();
    }

    @RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
    public void remove(@PathParam("id") Long id){
       logger.info("Deleting the role with id:" + id);
       roleService.deleteRole(id);
    }
}

App.factory('manageRoleService', ['$resource',
    function($resource) {
        return {
            getUserRoleDetails: $resource('api/role', {}, {
                query: {method: 'GET', isArray: true}
            }),
            removeUserRole: $resource('api/role/:id', {}, {
                delete: {method: 'DELETE', params: {id: '@id'}}
            })
        };
    }]);

但是现在当我调试其余方法时,似乎值没有被传递。它打印为空。

【讨论】:

  • 通过使用 pathVariable 而不是 pathParam 来修复它。感谢您的所有建议。
猜你喜欢
  • 2019-11-07
  • 2015-06-24
  • 2019-01-18
  • 2017-10-28
  • 2017-06-13
  • 2016-08-28
  • 2016-09-13
  • 1970-01-01
相关资源
最近更新 更多