java - BeanSerializer/BeanDeserializer Axis 生成的对象

标签 java jakarta-ee xml-serialization axis xml-deserialization

我有大量从多个 WSDL 生成的 Axis 对象,我需要一个通用的解决方案来将这些对象以 xml 格式存储在数据库中,同时在需要时将它们加载回 java 中。 这是我到目前为止所做的:

private String serializeAxisObject(Object obj) throws Exception {
    if (obj == null) {
        return null;
    }
    StringWriter outStr = new StringWriter();
    TypeDesc typeDesc = getAxisTypeDesc(obj);
    QName qname = typeDesc.getXmlType();
    String lname = qname.getLocalPart();
    if (lname.startsWith(">") && lname.length() > 1)
        lname = lname.substring(1);

    qname = new QName(qname.getNamespaceURI(), lname);
    AxisServer server = new AxisServer();
    BeanSerializer ser = new BeanSerializer(obj.getClass(), qname, typeDesc);
    SerializationContext ctx = new SerializationContext(outStr,
            new MessageContext(server));
    ctx.setSendDecl(false);
    ctx.setDoMultiRefs(false);
    ctx.setPretty(true);
    try {
        ser.serialize(qname, new AttributesImpl(), obj, ctx);
    } catch (final Exception e) {
        throw new Exception("Unable to serialize object "
                + obj.getClass().getName(), e);
    }

    String xml = outStr.toString();
    return xml;
}

    private Object deserializeAxisObject(Class<?> cls, String xml)
        throws Exception {
    final String SOAP_START = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header /><soapenv:Body>";
    final String SOAP_START_XSI = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Header /><soapenv:Body>";
    final String SOAP_END = "</soapenv:Body></soapenv:Envelope>";

    Object result = null;
    try {
        Message message = new Message(SOAP_START + xml + SOAP_END);
        result = message.getSOAPEnvelope().getFirstBody()
                .getObjectValue(cls);
    } catch (Exception e) {
        try {
            Message message = new Message(SOAP_START_XSI + xml + SOAP_END);
            result = message.getSOAPEnvelope().getFirstBody()
                    .getObjectValue(cls);
        } catch (Exception e1) {
            throw new Exception(e1);
        }
    }
    return result;
}

private TypeDesc getAxisTypeDesc(Object obj) throws Exception {
    final Class<? extends Object> objClass = obj.getClass();
    try {
        final Method methodGetTypeDesc = objClass.getMethod("getTypeDesc",
                new Class[] {});
        final TypeDesc typeDesc = (TypeDesc) methodGetTypeDesc.invoke(obj,
                new Object[] {});
        return (typeDesc);
    } catch (final Exception e) {
        throw new Exception("Unable to get Axis TypeDesc for "
                + objClass.getName(), e);
    }
}

我已经修复了它,如果其他人需要使用它,我会将其留在这里

玩得开心。

最佳答案

我已经修复了它,如果其他人需要使用它,我会将其留在这里。查看更新版本。

谢谢

关于java - BeanSerializer/BeanDeserializer Axis 生成的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23005703/

相关文章:

java - 从 swt 浏览器打开外部浏览器窗口

jakarta-ee - guava 之类的用于 Web 开发的 java 库

c# - 使用 XmlRootAttribute 将 XML 反序列化为 List<T>

.net - SGEN、InternalsVisibleTo 和程序集签名

c# - .net XmlSerializer,忽略基类属性

java - 不初始化局部变量并将属性(整数)初始化为 0 背后的逻辑是什么?

java - 想要在startActivity之前要求用户确认他的信息是否正确,android

java - Java中如何获取IV进行解密?

java - 在构造函数中调用像 Swing 的 add() 这样的可覆盖方法

java - 星火 java : Creating a new Dataset with a given schema