0

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

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

我正在使用 enunciate 构建支持 XML 和 JSON 的 SOAP 和 REST API。Enunciate 配置为使用所有 service.* 和 service.impl.* 类。每个服务都包含用于发音文档的所有 Javadoc,以及一个 [@GET @POST @PUT @DELETE] 和一个 @Path 注释。每个服务实现都包含一个类 @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”注释时,发音会运行得很好。但是,评论其中任何一个都将失败并显示上述消息。问题是我的服务包含 2-8 个不同的模型(例如:我的 addressService 包含 3 个对象:地址、州和国家/地区),因此我指定了路径上下文(使用地址)如下:

在 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),但运气不佳。

有没有其他人看到这个问题?关于我可以做些什么来解决它的任何想法?我有一种感觉,这将是那些“没有”的修复之一……只是不能把我的手指放在它上面。

在此先感谢您的帮助。

4

1 回答 1

4

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

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

其他参数必须用@QueryParameter、@PathParameter 等注释。

所以这条错误信息真正想说的是“对于所有使用@POST 和@PUT 注释的方法,您只能有一个未使用某些注释进行注释的参数。所有其他参数都需要有参数注释。”

于 2011-03-01T21:46:31.863 回答