必须在MyEclipse中新建Web Service Project时明确选择REST(JAX-RS)框架,否则@PathVariable等注解失效、路径404;类与方法均需正确使用@Path,路径拼接严格匹配;测试POST/PUT须设置Content-Type,避免415错误。

MyEclipse里创建REST服务,别直接选“Web Service Project”
MyEclipse的“Web Service Project”向导默认倾向SOAP(尤其老版本),选错框架会导致后续加JAX-RS注解无效、@Path不生效、甚至404。必须在新建项目时明确指定框架为 REST(JAX-RS),而不是留空或选“Axis2”“CXF”等SOAP相关选项。
常见错误现象:HTTP 404 访问 /services/xxx 报错;浏览器能打开首页但所有 @GET 路径返回 404;web.xml 里没生成 ServletContainer 配置。
- 新建项目路径:File → New → Web Service Project → 勾选
REST(JAX-RS) - 务必勾选
Generate web.xml deployment descriptor,否则 servlet 映射不会自动写入 - 如果项目已建好但选错了框架,不要硬改配置——重开新项目更省时间
REST资源类里@Path和@PathParam写错位置就404
@Path 必须同时出现在类和方法上,且路径拼接规则严格:类级 @Path("customer") + 方法级 @Path("{id}") → 实际访问路径是 /customer/{id},不是 /customer/id 或 /customer/{id}/(末尾斜杠会破坏匹配)。
容易踩的坑:
-
@PathParam("id")的字符串必须和 URL 花括号内完全一致,大小写敏感,多一个空格都不行 - 参数类型必须与路径变量语义匹配:ID 用
int或long,别用String后再手动 parse(除非真需要原始字符串) - 如果方法参数用了
@QueryParam却写成@PathParam,JAX-RS 容器根本不会注入值,参数为 null 或 0
测试REST接口时,别只靠浏览器GET,POST/PUT要配Content-Type
浏览器地址栏只能发 GET 请求,且无法设置请求头。用 curl 或 SoapUI 测试 POST/PUT 时,漏设 Content-Type: application/json 是最常导致 415 Unsupported Media Type 错误的原因。
Eclipse IDE 是一款由 Eclipse 基金会管理的开源、跨平台集成开发环境。其核心基于 Java 构建,通过强大的插件架构可扩展支持 C/C++、Python、PHP 等多种编程语言。它提供丰富的代码编辑、调试和重构工具,并紧密集成 Git、Maven 等现代开发工具链,是全球众多开发者首选的 Java 开发利器。
示例(发送 JSON 创建顾客):
curl -X POST http://localhost:8080/restdemo/jaxrs/customer \
-H "Content-Type: application/json" \
-d '{"id":1,"name":"Alice","address":"Beijing"}'
注意点:
- MyEclipse 默认用 Jersey 1.x,它对
application/json支持依赖jersey-json.jar,若缺失会报MessageBodyWriter not found - 如果用 JAXB(
@XmlRootElement)而没配 XML 头,Content-Type: application/xml必须显式声明 - SoapUI 中要在 “Request Properties” 里手动添加 Header,不能只填 Body
SOAP服务调试失败,先确认WSDL是否能被浏览器打开
SOAP 接口本质靠 WSDL 文件描述契约,如果 http://localhost:8080/yourapp/YourService?wsdl 打不开或返回 404,说明底层 servlet 没注册成功,REST 和 SOAP 的容器冲突很常见。
典型原因:
- 同一个项目混用 JAX-RS 和 JAX-WS 注解,MyEclipse 可能只加载其中一个容器
-
web.xml里同时存在ServletContainer(JAX-RS)和AxisServlet(SOAP),但没隔离 URL pattern - WSDL 地址里的服务名(如
YourService)必须和你发布的类名、@WebService的name属性一致
复杂点在于:REST 和 SOAP 共存时,URL 路由极易打架。比如 /services/* 被 Jersey 占了,SOAP 就收不到请求。要么分不同 context path,要么用不同 servlet name,不能图省事全扔一个路径下。

















