开发中Restful API遇Error 405:Jersey JPA与Angular5更新失败
解决Jersey + Angular5更新操作的Error 405问题
先直接说核心问题:你的前端PUT请求的URL路径和后端Jersey定义的PUT接口路径不匹配,导致服务器找不到对应的处理方法,返回405 Method Not Allowed。
具体问题分析
- 后端Jersey的PUT接口定义是:
@Path("/update") @PUT @Consumes(MediaType.APPLICATION_JSON) public void update(Langue langue) { langueDao.update(langue); }
这个接口的路径是/langue/update,只接收请求体里的Langue对象,不需要在URL里拼接ID。
- 但前端Angular的
updateLangue方法里,把ID直接拼在了URL末尾:
return this.http.put('http://localhost:8081/APIRest/resources/langue/update' + langue.langueId, JSON.stringify(langue), httpOptions);
这样实际请求的URL会变成/langue/update3092(比如langueId是3092),而后端根本没有定义/update{id}路径的PUT接口,服务器自然找不到对应的处理方法,返回405。
解决方案(二选一)
方案1:修改前端代码,去掉URL里的ID拼接
因为后端接口是通过请求体接收完整的Langue对象,里面已经包含了ID,所以不需要在URL里传ID。修改langue.service.ts的updateLangue方法:
updateLangue(langue:Langue) { // 去掉ID拼接,保持URL和后端一致 return this.http.put('http://localhost:8081/APIRest/resources/langue/update', JSON.stringify(langue), httpOptions); }
方案2:修改后端接口,支持路径参数传ID
如果你希望通过URL路径传递ID(更符合REST风格),可以修改Jersey的PUT接口:
@Path("/update/{id}") @PUT @Consumes(MediaType.APPLICATION_JSON) public void update(@PathParam("id") long id, Langue langue) { // 这里可以用id做额外校验,比如确保请求体里的ID和路径ID一致 langueDao.update(langue); }
同时修改前端的URL拼接,记得加上斜杠(避免出现update3092这种奇怪的路径):
updateLangue(langue:Langue) { return this.http.put('http://localhost:8081/APIRest/resources/langue/update/' + langue.langueId, JSON.stringify(langue), httpOptions); }
额外的bug修复
顺便提一下,你的后端delete方法注解写错了,多了个空格:
@ @Consumes(MediaType.APPLICATION_JSON)
应该改成:
@DELETE @Consumes(MediaType.APPLICATION_JSON)
不然后续调用delete接口也会出问题。
内容的提问来源于stack exchange,提问作者papaletunde
相关产品推荐
相关产品推荐

