Axis 2:使用Tomcat 8"URI不能为空"

giu*_*s92 2 xml ant axis2 tomcat7 tomcat8

我安装了Axis2/Java(1.6.2)作为Tomcat(8.0.5)Webapp.

我开发了两个服务(HelloWorld和简单的计算器),它们工作正常.

现在,我尝试使用一种从外部XML读取信息的方法来开发服务.

该文件位于以下目录中:"$ CATALINA_HOME/webapps/axis2/myService /".

我使用Ant编译.aar存档.

当我通过url调用此方法时

http://127.0.0.1:8080/axis2/services/InventoryCheck/doCheck?args0=12&args1=9
Run Code Online (Sandbox Code Playgroud)

我收到:

<soapenv:Reason xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Text xml:lang="en-US">URI cannot be null</soapenv:Text>
</soapenv:Reason>
Run Code Online (Sandbox Code Playgroud)

我尝试与Tomcat 7相同的服务,它工作正常.

我怎么解决?

谢谢


这是服务java类:

public class InventoryCheckService {

private String path = "myService/products.xml";

public boolean doCheck(String sku, int quantity){

    MessageContext msgContext = MessageContext.getCurrentMessageContext();
    ServletContext servletContext = (ServletContext) msgContext.getProperty(HTTPConstants.MC_HTTP_SERVLETCONTEXT);
    String realPath = servletContext.getRealPath(path);

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setNamespaceAware(true);

    Document doc = null;
    try {
        DocumentBuilder builder = factory.newDocumentBuilder();
        doc = builder.parse(realPath);
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

    ReaderXML reader = new ReaderXML(doc);
    Product product = reader.getBySku(sku);

    return (product != null) && (product.getQuantity() >= quantity);

}
}
Run Code Online (Sandbox Code Playgroud)

如果我将字符串realPath定义为products.xml文件的绝对路径,它可以正常工作.所以问题在于以下三个方面:

MessageContext msgContext = MessageContext.getCurrentMessageContext();
ServletContext servletContext = (ServletContext) msgContext.getProperty(HTTPConstants.MC_HTTP_SERVLETCONTEXT);
String realPath = servletContext.getRealPath(path);
Run Code Online (Sandbox Code Playgroud)

还有两个简单的java类定义了Object ReaderXML和Product.

这是services.xml文件:

<service name="InventoryCheck">

<description>
    Webservice Inventory Check
</description>

<messageReceivers>
    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>

<parameter name="ServiceClass">com.myService.service.InventoryCheckService</parameter>

</service>
Run Code Online (Sandbox Code Playgroud)

giu*_*s92 7

决议:

为了使这项服务也能用于Tomcat 8,我只改变了String路径

从:

private String path = "myService/products.xml";
Run Code Online (Sandbox Code Playgroud)

至:

private String path = "/myService/products.xml";
Run Code Online (Sandbox Code Playgroud)

不带"/"的字符串仅适用于Tomcat 7,不能与Tomcat 8.0.5一起使用.