Объявлять ошибку во время вызова, когда в аннотированной службе JAX-RS поддерживается полный CRUD

Я столкнулся с довольно интересной ошибкой произнесения:

«Допускается не более одного параметра объекта JAX-RS (все остальные параметры должны быть аннотированы одной из аннотаций параметра ресурса JAX-RS)».

Я использую enunciate для создания как SOAP, так и REST API с поддержкой XML и JSON. 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" в своем сервисе, enunciate будет работать нормально. Тем не менее, если вы вернетесь к комментарию, это не приведет к тому, что сообщение будет приведено выше. Загвоздка в том, что у меня есть сервисы, которые охватывают 2-8 разных моделей (пример: мой addressService включает 3 объекта: адрес, штат и страна), поэтому я указал контексты пути (используя адрес) следующим образом:

на импл:

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

по методам:

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

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

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

Если я могу предоставить больше информации, я был бы рад. Это была довольно неприятная проблема, потому что я не уверен, правильно ли я настроил enunciate (сомнительно, это базовая конфигурация) или я растягиваю возможности JAX-RS. Я потратил немало времени на чтение руководств, поиск в Google и просмотр Javadoc (для формулировки и JAX-RS), но мне не повезло.

Кто-нибудь еще видел эту проблему? Любые мысли о том, что я могу сделать, чтобы исправить это? У меня такое ощущение, что это будет одно из тех "не-дух" исправлений... просто не могу понять.

Заранее спасибо за помощь.


person MaddHacker    schedule 01.03.2011    source источник


Ответы (1)


«Параметр объекта» — это параметр, указанный в теле запроса REST. Другими словами, тело запроса читается и делается попытка десериализовать его в объект типа вашего параметра, а затем вызывается запрос.

Поскольку может быть только одно тело, может быть только один параметр сущности.

Остальные параметры должны быть аннотированы с помощью @QueryParameter, @PathParameter и т. д.

Итак, это сообщение об ошибке на самом деле пытается сказать: «для всех методов, аннотированных с помощью @POST и @PUT, вы можете иметь только один параметр, который не аннотирован какой-либо аннотацией. Все остальные параметры должны иметь аннотацию параметра».

person Ryan Heaton    schedule 01.03.2011
comment
о! Это была не такая сделка. Большое спасибо за помощь, Райан, изложение было потрясающим! - person MaddHacker; 02.03.2011