我正在使用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);
}
如果entity不为null,一切正常。
但是我想用空体来处理请求。我希望,在这种情况下,实体将为空。但事实并非如此。如果body为null,似乎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);
}
但它也没有用。
您对如何处理null entites参数有任何想法吗?
答案 0 :(得分:0)
我认为,如果你的webservice @Consumes(MediaType.APPLICATION_XML)
身体不能为空。
但是你可以通过@Provider
阅读MyEntity
对象来处理这个问题。
@Provider
@Consumes(MediaType.APPLICATION_XML)
public class XMLReader implements MessageBodyReader<MyEntity>{
}
答案 1 :(得分:0)
方法重载(如您的示例中所示)可以正常工作(在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);
}