[英]Xml to Java Class using JAXBContext
我创建了几个 REST Web 服务,它们将从我的数据库中返回记录列表。
我以 XML 格式返回所有查询结果,并在我的 Web 服务方法中将其转换为 Java 以将其以 JSON 格式发送到我的客户端应用程序(我知道,这不是最好的情况)。
我试图减少我的方法中的代码,我开始使用的代码的一部分是 XML 到 Java 的转换。
现在我正在使用以下
String xml = xml.replaceFirst("ROWSET xmlns:xsi = " + "\"http://www.w3.org/2001/XMLSchema-instance\"", "invTrxXmlList");
String string = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
xml = string.concat(xml);
xml = xml.replaceAll("ROWSET", "invTrxXmlList");
xml = xml.replaceAll("ROW", "invTrxXmlList");
xml = xml.replaceAll(" xsi:nil = \"true\"", "");
InputStream instr = new ByteArrayInputStream(xml.getBytes());
JAXBContext jaxbContext = JAXBContext.newInstance(InvTrxXmlList.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
InvTrxXmlList invTrxXml = (InvTrxXmlList) jaxbUnmarshaller.unmarshal(instr);
inventoryTrx = new InventoryTrx(invTrxXml);
我想要的是创建一个单独的方法,该方法可以被该作业的所有方法调用,如果可能的话,可以使用多个不同的自定义对象,例如 InvTrxXmlList。
我在另一项任务中使用了 Reflection,我正在考虑使用它来解决这个问题。
你能帮助我吗?
还有另一种方法吗?
谢谢
创建一个Java类1. @ Path(“ / URL”)2.类名3. @GET或@POST 4. @Path(“ / URL”)5. @Produces(“ application / xml”)JAXBElement getProduct()然后,您可以使用DOJO来获取或设置数据
以下代码显示了如何使用生成的类在JAX-RS资源方法中以XML形式返回JAXB元素:
@Path("/product")
public class ProductService {
@GET
@Path("/get")
@Produces("application/xml")
public JAXBElement<Product> getProduct() {
Product prod = new Product();
prod.setId(1);
prod.setName("Mattress");
prod.setDescription("Queen size mattress");
prod.setPrice(500);
return new ObjectFactory().createProduct(prod);
}
}
对于@POST和@PUT资源方法,可以将Product对象直接用作参数。 JAX-RS将XML数据从请求映射到Product对象。
@Path("/product")
public class ProductService {
@GET
// ...
@POST
@Path("/create")
@Consumes("application/xml")
public Response createProduct(Product prod) {
// Process or store the product and return a response
// ...
}
}
谢谢西尔弗雷德,
我能够将其与以下代码一起使用
public Object xmlToJava(Object pCurrentObject, String pXml, String pRowset, String pRow) {
InputStream instr = null;
JAXBContext jaxbContext = null;
Unmarshaller jaxbUnmarshaller = null;
String xmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
String xmlReturn = null;
Class objectClass = pCurrentObject.getClass();
try {
xmlReturn =
pXml.replaceFirst("ROWSET xmlns:xsi = " +
"\"http://www.w3.org/2001/XMLSchema-instance\"",
pRowset); //"invTrxLines");
xmlReturn = xmlHeader.concat(xmlReturn);
xmlReturn = xmlReturn.replaceAll("ROWSET", pRowset); //"invTrxLines");
if (null != pRow && !pRow.isEmpty()) {
xmlReturn = xmlReturn.replaceAll("ROW", pRow); //invTrxLine);
} else { //Remove Row tags in case of single object
xmlReturn = xmlReturn.replaceAll("<ROW>", "");
xmlReturn = xmlReturn.replaceAll("</ROW>", "");
}
xmlReturn = xmlReturn.replaceAll(" xsi:nil = \"true\"", "");
instr = new ByteArrayInputStream(xmlReturn.getBytes());
jaxbContext = JAXBContext.newInstance(objectClass); //InvTrxHead.class);
jaxbUnmarshaller = jaxbContext.createUnmarshaller();
pCurrentObject = jaxbUnmarshaller.unmarshal(instr);
} catch (Exception e) {
// TODO: Add catch code
e.printStackTrace();
}
return pCurrentObject;
}
与以下电话
invTrxHead = (InvTrxHead) WSUtils.xmlToJava(invTrxHead, invTrxHeadXml, "invTrxHead", null);
现在,我可以从数据库和对象实例中提取XML,而不必重复任何代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.