2014-04-11 1 views
0

여러 개의 WSDL에서 많은 수의 축으로 생성 된 객체가 있습니다. 데이터베이스에 객체를 XML 형식으로 저장하는 일반적인 솔루션이 필요하지만 필요할 때 다시로드 할 수 있습니다. 이것은 내가 지금까지 만든 한 것입니다 : 나는 그것을 해결 한BeanSerializer/BeanDeserializer 축 생성 객체

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); 
    } 
} 

다른 사람이 그것을

재미를 사용할 필요가 있다면, 나는 여기를 떠날 것입니다.

답변

0

나는 그것을 고쳤으며, 다른 누군가가 그것을 사용해야 할 경우 여기에서 남겨 둘 것입니다. 업데이트 된 버전을 확인하십시오.

감사합니다.