You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发中Restful API遇Error 405:Jersey JPA与Angular5更新失败

解决Jersey + Angular5更新操作的Error 405问题

先直接说核心问题:你的前端PUT请求的URL路径和后端Jersey定义的PUT接口路径不匹配,导致服务器找不到对应的处理方法,返回405 Method Not Allowed。

具体问题分析

  1. 后端Jersey的PUT接口定义是:
@Path("/update")
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public void update(Langue langue) {
 langueDao.update(langue);
}

这个接口的路径是/langue/update,只接收请求体里的Langue对象,不需要在URL里拼接ID。

  1. 但前端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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:50