Java中RequestV1适配XmlObject及实例化问题求解
解决方案
针对你的问题,有几种可行的修改方式,既能满足validateRequest的参数类型要求,又能保留RequestV1.Factory.newInstance()的实例获取方式:
方式一:让RequestV1作为普通类实现XmlObject接口
把RequestV1从抽象类改回普通类,并实现XmlObject接口,这样就能直接传递给validateRequest方法,同时工厂类可以正常实例化对象。注意需要实现XmlObject接口的所有方法,你可以根据实际需求直接实现,或者通过委托给内部的XmlObject实例来简化代码:
import org.apache.xmlbeans.XmlObject; import lombok.Getter; import lombok.Setter; @Getter @Setter public class RequestV1 implements XmlObject { // 可选:如果不想自己实现所有XmlObject方法,可以委托给一个XmlObject实例 private XmlObject xmlDelegate; public static class Factory { public static RequestV1 newInstance() { return new RequestV1(); } } // 示例:实现XmlObject的schemaType方法 @Override public org.apache.xmlbeans.SchemaType schemaType() { return xmlDelegate != null ? xmlDelegate.schemaType() : null; } // 其他XmlObject接口方法按需求实现或委托 }
方式二:重载validateRequest方法(无需修改RequestV1结构)
如果你不想修改RequestV1的类结构,可以给validateRequest添加一个接收RequestV1参数的重载方法,在方法内部把RequestV1转换为XmlObject后再调用原方法:
// 保留原有的validateRequest方法 public void validateRequest(final XmlObject request) { // 原校验逻辑 } // 添加重载方法 public void validateRequest(final RequestV1 request) { // 将RequestV1转换为XmlObject,示例使用JAXB+XmlBeans转换,可根据实际情况调整 XmlObject xmlObject = convertToXmlObject(request); validateRequest(xmlObject); } // 实现转换逻辑 private XmlObject convertToXmlObject(RequestV1 request) { try { // 序列化RequestV1为XML字符串 StringWriter writer = new StringWriter(); javax.xml.bind.JAXBContext context = javax.xml.bind.JAXBContext.newInstance(RequestV1.class); context.createMarshaller().marshal(request, writer); // 解析XML字符串为XmlObject return org.apache.xmlbeans.XmlObject.Factory.parse(writer.toString()); } catch (Exception e) { throw new RuntimeException("RequestV1转XmlObject失败", e); } }
方式三:如果RequestV1应为XmlBeans生成类
如果你的RequestV1本来应该是通过XmlBeans的XML Schema生成的类,那直接使用XmlBeans的代码生成工具生成对应的类即可,生成的类会自动实现XmlObject接口,同时也会包含类似的工厂方法。
内容的提问来源于stack exchange,提问作者Josh Helman
相关产品推荐
相关产品推荐

