我有一个cxf JAX-RS服务,看起来像下面的那个。当我提交请求类型为“application / xml”的请求时,我希望cxf自动将我的返回值转换为xml。这适用于方法getData
,但不适用于其他2种方法。其他2个方法返回返回值的简单String表示形式,例如2.0
或true
。如何让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);
}
答案 0 :(得分:2)
问题是String
和boolean
都没有自然表示作为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的提供程序,但这很麻烦,并且会以意想不到的方式影响整个应用程序,您真的不应该为简单类型执行此操作,好吗?