cxf jax-rs:如何将基本类型编组为XML?

时间:2011-11-29 04:59:53

标签: jaxb cxf jax-rs

我有一个cxf JAX-RS服务,看起来像下面的那个。当我提交请求类型为“application / xml”的请求时,我希望cxf自动将我的返回值转换为xml。这适用于方法getData,但不适用于其他2种方法。其他2个方法返回返回值的简单String表示形式,例如2.0true。如何让cxf返回所有3种方法的XML文档?

@WebService
@Consumes("application/xml")
@Produces("application/xml")
public interface MyServiceInterface {
    final static String VERSION = "2.0";

    @WebMethod
    @GET
    @Path("/version")
    String getVersion();

    @WebMethod
    @GET
    @Path("/data/{user}")
    Data[] getData(@PathParam("user") String username) throws IOException;

    @WebMethod
    @GET
    @Path("/user/{user}")
    boolean doesUserExist(@PathParam("user") String username);
}

1 个答案:

答案 0 :(得分:2)

问题是Stringboolean都没有自然表示作为XML文档; XML需要一个外部元素,CXF和JAXB(XML绑定层)都不知道它应该是什么。

最简单的方法是在一个带有JAXB注释的小包装器中返回基本类型:

@XmlRootElement
public class Version {
    @XmlValue
    public String version;
}
@XmlRootElement
public class UserExists {
    @XmlValue
    public boolean exists;
}
@WebService
@Consumes("application/xml")
@Produces("application/xml")
public interface MyServiceInterface {
    final static String VERSION = "2.0";

    @WebMethod
    @GET
    @Path("/version")
    // TYPE CHANGED BELOW!
    Version getVersion();

    @WebMethod
    @GET
    @Path("/data/{user}")
    Data[] getData(@PathParam("user") String username) throws IOException;

    @WebMethod
    @GET
    @Path("/user/{user}")
    // TYPE CHANGED BELOW!
    UserExists doesUserExist(@PathParam("user") String username);
}

执行此操作的另一种方法是注册知道如何将字符串和布尔值转换为XML的提供程序,但这很麻烦,并且会以意想不到的方式影响整个应用程序,您真的不应该为简单类型执行此操作,好吗?