0

我正在开发一个 Axis 服务来与 HL7 远程服务交互。我有一个类(Hl7MessageTranslator)来编码这样的查询请求:

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

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

在 tomcat 环境(JUnit 测试)之外调用 encodeRequest() 方法时工作正常,但从 Axis 服务调用时失败:我在创建类时收到以下警告:

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. 

调用 parser.encode() 方法时出现以下错误:

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 调用时有效,所以它一定是依赖/配置问题,但我不知道在哪里寻找它。

提前致谢

马西莫

4

2 回答 2

1

这是与轴依赖关系的 jar 冲突问题。如果您有任何单独的 log4j jar 将其删除。

于 2014-05-20T07:59:44.503 回答
1

我终于摆脱了这种状态。

正如 Hussein Zawawi 所说,这是与轴的 jar 冲突,只是原因是Xerces而不是log4j

似乎某些 HAPIDefaultXMLParser方法需要org.w3c.dom对象,但我环境中的工厂产生了对象org.apache.xerces.dom

不幸的是,我无法在不破坏我正在使用的遗留软件的情况下从项目中删除Xerces 。最终,我不得不编写自己的实现来重写错误方法并替换 XML 解析和序列化调用。DefaultXMLParser

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,但我希望我的解决方案在将来有用。

于 2014-05-28T14:18:05.687 回答