#cxf #jax-rs
#cxf #jax-rs
Вопрос:
Я использую Apache CXF в качестве реализации JAX-RS, и у меня проблема с необязательными «параметрами объекта». Взгляните на этот фрагмент кода:
@Path("/")
public class myClass {
@PUT
@Path("/{p1}/something/{p2}/something/{p3}/something/{p4}")
@Consumes(MediaType.APPLICATION_XML)
Response updateStuff(
@PathParam("p1") String p1,
@PathParam("p2") Long p2,
@PathParam("p3") String p3,
@PathParam("p4") Long p4,
MyEntity entity);
}
Если объект не равен нулю, все работает нормально.
Однако я хочу обрабатывать запросы с пустым телом. Я бы ожидал, что в таком случае объект будет равен нулю. Но это не так. Кажется, что CXF не может найти мой метод, если тело равно нулю. В журналах я могу найти предупреждение о пустом теле сообщения (от AbstractJAXBProvider) и это все.
Я также пытался перегрузить метод updateStuff:
@Path("/")
public class myClass {
@PUT
@Path("/{p1}/something/{p2}/something/{p3}/something/{p4}")
@Consumes(MediaType.APPLICATION_XML)
Response updateStuff(
@PathParam("p1") String p1,
@PathParam("p2") Long p2,
@PathParam("p3") String p3,
@PathParam("p4") Long p4,
MyEntity entity);
@PUT
@Path("/{p1}/something/{p2}/something/{p3}/something/{p4}")
Response updateStuff(
@PathParam("p1") String p1,
@PathParam("p2") Long p2,
@PathParam("p3") String p3,
@PathParam("p4") Long p4);
}
Но это тоже не сработало.
Есть ли у вас какие-либо идеи, как обрабатывать параметры нулевых объектов?
Ответ №1:
Я думаю, что если вы используете веб @Consumes(MediaType.APPLICATION_XML)
-сервис, тело не может быть нулевым. Но вы можете справиться с этим, имея @Provider
MyEntity
объект для чтения.
@Provider
@Consumes(MediaType.APPLICATION_XML)
public class XMLReader implements MessageBodyReader<MyEntity>{
}
Ответ №2:
Перегрузка метода, как в вашем примере, работает (протестировано в Apache-cxf 3.0), но клиент не должен отправлять Content-Type: application/xml
заголовок, когда он хочет использовать метод без объекта в подписи.
Если на уровне класса уже определен другой тип носителя @Consumes(MediaType.WILDCARD)
, добавьте к методу аннотацию, см. Пример ниже.
@Path("/")
@Consumes(MediaType.APPLICATION_XML)
public class myClass {
@PUT
@Path("/{p1}/something/{p2}/something/{p3}/something/{p4}")
Response updateStuff(
@PathParam("p1") String p1,
@PathParam("p2") Long p2,
@PathParam("p3") String p3,
@PathParam("p4") Long p4,
MyEntity entity);
@PUT
@Path("/{p1}/something/{p2}/something/{p3}/something/{p4}")
@Consumes(MediaType.WILDCARD)
Response updateStuff(
@PathParam("p1") String p1,
@PathParam("p2") Long p2,
@PathParam("p3") String p3,
@PathParam("p4") Long p4);
}