2014-05-20 1 views
0

HL7 원격 서비스와의 인터페이스를 위해 Axis 서비스를 개발 중입니다.Axis 서비스에서 Hapi 사용 : "XML 문서를 만들 수 없습니다"

public Hl7MessageTranslator(...) 
{ 
... 
parser = new DefaultXMLParser(); 
} 

public String encodeRequest(...) throws ... HL7Exception 
{ 
// prepare HL7 query request 
QRY_A19 qryA19 = new QRY_A19(); 
    ... 
    return parser.encode(qryA19); 
} 

encodeRequest() 톰캣 환경 (JUnit 테스트) 외부에서 호출 할 때하지만 축 서비스에서 호출이 실패 할 때 방법은 잘 작동 : 내가 얻을이 같은 쿼리 요청을 인코딩하는 클래스 (Hl7MessageTranslator)가 다음과 같은 경고 클래스 만드는 동안 다음 parser.encode를 호출하는 동안

SLF4J: This version of SLF4J requires log4j version 1.2.12 or later. See also http://www.slf4j.org/codes.html#log4j_version 
INFO - 2014-05-20 09:11:07,543 - Classe: ca.uhn.hl7v2.util.Home - Metodo: setHomeDirectory - Descrizione: hapi.home is set to C:\Programmi\eclipse-j2ee-helios\. 
INFO - 2014-05-20 09:11:07,933 - Classe: ca.uhn.hl7v2.VersionLogger - Metodo: printHapiVersion - Descrizione: HAPI version is: 2.2 
INFO - 2014-05-20 09:11:07,949 - Classe: ca.uhn.hl7v2.VersionLogger - Metodo: checkStructureLibraries - Descrizione: Default Structure libraries found for HL7 versions 2.5, 2.6, 
WARN - 2014-05-20 09:11:08,011 - Classe: ca.uhn.hl7v2.VersionLogger - Metodo: checkDOMImplementation - Descrizione: Error occured while trying to retrieve a DOMImplementation. 
java.lang.RuntimeException: java.lang.ClassCastException: org.apache.xerces.dom.DOMXSImplementationSourceImpl cannot be cast to org.w3c.dom.DOMImplementationSource 
at ca.uhn.hl7v2.util.XMLUtils.getDOMImpl(XMLUtils.java:55) 
at ca.uhn.hl7v2.VersionLogger.checkDOMImplementation(VersionLogger.java:44) 
at ca.uhn.hl7v2.VersionLogger.init(VersionLogger.java:36) 
at ca.uhn.hl7v2.DefaultHapiContext.<init>(DefaultHapiContext.java:126) 
at ca.uhn.hl7v2.DefaultHapiContext.<init>(DefaultHapiContext.java:112) 
at ca.uhn.hl7v2.DefaultHapiContext.<init>(DefaultHapiContext.java:103) 
at ca.uhn.hl7v2.parser.Parser.<init>(Parser.java:71) 
at ca.uhn.hl7v2.parser.XMLParser.<init>(XMLParser.java:89) 
at ca.uhn.hl7v2.parser.DefaultXMLParser.<init>(DefaultXMLParser.java:81) 
at com.avelco.integrazioni.areavasta.naar.Hl7MessageTranslator.<init>(Hl7MessageTranslator.java:105) 
at com.avelco.integrazioni.areavasta.naar.NaarBridge.requestGrid(NaarBridge.java:135) 
at com.avelco.integration.services.Service.requestGrid(Service.java:122) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
... 
WARN - 2014-05-20 09:11:08,011 - Classe: ca.uhn.hl7v2.VersionLogger - Metodo: checkDOMImplementation - Descrizione: XML parsing and encoding as well as working with Conformance Profiles will fail. 

다음과 같은 오류를() 메소드 :

20/05/2014 09:11:08 : debug: Filling MSH ... 
20/05/2014 09:11:08 : debug: Filling QRD ... 
20/05/2014 09:11:08 : debug: Filling QRF ... 
ca.uhn.hl7v2.HL7Exception: Can't create XML document - java.lang.RuntimeException 
at ca.uhn.hl7v2.parser.DefaultXMLParser.encodeDocument(DefaultXMLParser.java:115) 
at ca.uhn.hl7v2.parser.XMLParser.doEncode(XMLParser.java:241) 
at ca.uhn.hl7v2.parser.Parser.encode(Parser.java:276) 
at com.avelco.integrazioni.areavasta.naar.Hl7MessageTranslator.encodeRequest(Hl7MessageTranslator.java:174) 
at com.avelco.integrazioni.areavasta.naar.NaarBridge.requestGrid(NaarBridge.java:144) 
at com.avelco.integration.services.Service.requestGrid(Service.java:122) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 

JUnit에 의해 호출 될 때 작동하기 때문에 종속성/구성 문제 여야하지만 어디에 있는지 찾아 낼 수 없습니다. 사전에

감사

마시모

답변

0

마침내 나왔습니다.

으로 후세인 Zawawi는 단지 그것을 Xerces에하지 log4j에 원인이었다, 그것은 축과 항아리 충돌 제안했다.

몇 가지 HAPI DefaultXMLParser 방법 org.w3c.dom 개체 예상 것으로 보인다하지만 내 환경에서 공장 org.apache.xerces.dom 사람을 생산했다.

불행하게도 내가 함께 일하고 있어요 기존 소프트웨어를 파괴하지 않고 프로젝트의 Xerces를을 제거 할 수 없습니다. 결국 DefaultXMLParser 메서드를 대체하고 XML 구문 분석 및 직렬화 호출을 다시 작성해야했습니다.

public class AvXmlParser extends DefaultXMLParser 
{ 

/* 
* (non-Javadoc) 
* @see ca.uhn.hl7v2.parser.DefaultXMLParser#encodeDocument(ca.uhn.hl7v2.model.Message) 
*/ 
public Document encodeDocument(Message source) throws HL7Exception 
{ 
String messageClassName = source.getClass().getName(); 
String messageName = messageClassName.substring(messageClassName.lastIndexOf('.') + 1); 
org.w3c.dom.Document doc = null; 
try 
{ 
// doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 
    doc = XmlUtilities.emptyDom(); 
// Element root = doc.createElement(messageName); 
    Element root = doc.createElementNS("urn:hl7-org:v2xml",messageName); 
    doc.appendChild(root); 
} 
catch (Exception e) 
{ 
    throw new HL7Exception("Can't create XML document - " + e.getClass().getName(), e); 
} 
encode(source, doc.getDocumentElement()); 
return doc; 
} 

/** 
* @param groupObject 
* @param groupElement 
* @throws HL7Exception 
*/ 
private void encode(ca.uhn.hl7v2.model.Group groupObject, org.w3c.dom.Element groupElement) throws HL7Exception 
{ 
String[] childNames = groupObject.getNames(); 
String messageName = groupObject.getMessage().getName(); 
try 
{ 
    for (int i = 0; i < childNames.length; i++) 
    { 
    Structure[] reps = groupObject.getAll(childNames[i]); 
    for (int j = 0; j < reps.length; j++) 
    { 
     Element childElement = groupElement.getOwnerDocument().createElement(makeGroupElementName(messageName, childNames[i])); 
     groupElement.appendChild(childElement); 
     if (reps[j] instanceof Group) 
     { 
     encode((Group) reps[j], childElement); 
     } 
     else if (reps[j] instanceof Segment) 
     { 
     encode((Segment) reps[j], childElement); 
     } 
    } 
    } 
} 
catch (DOMException e) 
{ 
    throw new HL7Exception("Can't encode group " + groupObject.getClass().getName(), e); 
} 
} 

/* 
* (non-Javadoc) 
* @see ca.uhn.hl7v2.parser.XMLParser#parseStringIntoDocument(java.lang.String) 
*/ 
protected synchronized Document parseStringIntoDocument(String message) throws HL7Exception 
{ 
try 
{ 
    Document doc = XmlUtilities.parseString(message); 
    return doc; 
} 
catch (Exception e) 
{ 
    throw new HL7Exception("Exception parsing XML",e); 
} 
} 
} 

합니다 (XmlUtilities 클래스는 유틸리티 클래스 내 환경에서 이미 사용할 수 있습니다). 대부분의 문제는 HAPI 또는 Xerces 때문이 아닌 기존 소프트웨어 때문에 발생했지만 내 솔루션이 향후 유용 할 수 있기를 바랍니다.

1

그것은 축 종속성이 항아리 충돌 문제입니다. 별도의 log4j jar 파일이 있으면 제거하십시오.

+0

고마워요 ... classpath에서 log4j를 제거하려고했지만 작동하지 않습니다. log4j가 없으면 JUnit에서 호출해도 클래스가 실패합니다. – Maxx

+0

클래스 경로가 tomcat과 관련이 없습니다. 당신은 거기에 참조를 유지할 수 있지만 당신이 바람둥이 webapp에 항아리를 이동하지 않도록하십시오 –

+0

좋아, 내가 이것을 시도합니다. (내 서비스는 독점적 인 프레임 워크의 일부이므로 시간이 걸릴 것입니다 ...) – Maxx

관련 문제