CXF和可选实体参数

时间:2011-10-28 12:43:43

标签: 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); 
}

如果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参数有任何想法吗?

2 个答案:

答案 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); 
}
相关问题