在JAX-RS带注释的服务中支持完整CRUD时,在调用期间发出错误

时间:2011-03-01 19:39:25

标签: spring rest jax-rs enunciate

我遇到了一个相当有趣的发音错误:

“只允许一个JAX-RS实体参数(所有其他参数必须使用JAX-RS资源参数注释之一注释)。”

我正在使用enunciate构建SOAP和REST API,支持XML和JSON。 Enunciate配置为使用所有service。*和service.impl。*类。每个服务都包含用于enunciate文档的所有Javadoc,以及[@GET @POST @PUT @DELETE]和@Path注释。每个服务impl都包含一个类@Path注释。

示例界面:

public interface myService {

  @GET
  @Path("/something")
  Object doGetAll();

  @GET
  @Path("/something/{id}"
  Object doGetOne(@PathParam("id") Integer id);

  @PUT
  @Path("/something")
  Object doCreate(/*params*/);

  @POST
  @Path("/something/{id}")
  Object doUpdate(@PathParam("id") Integer id, /*params*/);

  @DELETE
  @Path("/something/{id}")
  Object doDelete(@PathParam("id") Integer id);
}

示例实施:

@Path("/base")
public class myServiceImpl implements myService {

  Object doGetAll() {/*stuff*/}

  Object doGetOne(Integer id) {/*stuff*/}

  Object doCreate(/*params*/) {/*stuff*/}

  Object doUpdate(Integer id, /*params*/) {/*stuff*/}

  Object doDelete(Integer id) {/*stuff*/}
}

当我在我的服务中注释掉“@POST”和“@PUT”注释时,enunciate将运行得很好。但是,重新评论将失败,并显示上述消息。问题是我的服务包含2-8个不同的模型(例如:我的addressService包含3个对象:地址,州和国家),所以我已经指定了路径上下文(使用地址),如下所示:

on impl:

@Path("/address")
public class myAddressServiceImpl implements myAddressService {}

关于方法:

@GET
@Path("/{id}")
findAddressById();

@GET
@Path("/states/{id}")
findStateById();

@GET
@Path("/countries/{id}")
findCountryById();

如果我能提供更多信息,我很乐意。这是一个相当令人沮丧的问题,因为我不确定我是否配置错误(令人怀疑,这是一个基本配置)或者我是否正在扩展JAX-RS可以做什么。我花了很多时间阅读教程,谷歌搜索并查看Javadoc(用于发音和JAX-RS),但没有太多运气。

还有其他人看过这个问题吗?我有什么想法可以解决它?我感觉这将成为那些“没有”修复之一......只是不能把手指放在它上面。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

“实体参数”是由REST请求正文指定的参数。换句话说,读取请求主体并尝试将其反序列化为参数类型的对象,然后调用请求。

由于只能有一个实体,因此只能有一个实体参数。

其他参数必须使用@QueryParameter,@ PathParameter等进行注释。

所以这个错误消息真正试图说的是“对于所有使用@POST和@PUT注释的方法,你只能有一个没有注释某些注释的参数。所有其他参数都需要有一个参数注释“。