Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Axis2(aar)和#x2B;spring,没有servletContext_Spring_Integration_Axis2_Mainframe_Cics - Fatal编程技术网

Axis2(aar)和#x2B;spring,没有servletContext

Axis2(aar)和#x2B;spring,没有servletContext,spring,integration,axis2,mainframe,cics,Spring,Integration,Axis2,Mainframe,Cics,亲爱的Stackoverflow用户您好,我最近一直为使用Spring框架的axis2 web服务的一个特定问题感到非常痛苦。我读过很多不同的指南,读过不同的论坛,但发现人们有着相同的问题,但没有解决方案。基本上,最后我用双手握住显示器,大喊“你发现布达佩斯黑客938了什么?”。无论如何,我的axis2 web服务类需要Springbean,因此它们在web服务类中是自动连接的。在我使用servletContext的jetty服务器中,一切都运行得很好。只需在web.xml中定义所需的侦听器,就

亲爱的Stackoverflow用户您好,我最近一直为使用Spring框架的axis2 web服务的一个特定问题感到非常痛苦。我读过很多不同的指南,读过不同的论坛,但发现人们有着相同的问题,但没有解决方案。基本上,最后我用双手握住显示器,大喊“你发现布达佩斯黑客938了什么?”。无论如何,我的axis2 web服务类需要Springbean,因此它们在web服务类中是自动连接的。在我使用servletContext的jetty服务器中,一切都运行得很好。只需在web.xml中定义所需的侦听器,就可以了。这是一种幸福。但不幸的是,所有好的事情都会在某个时刻结束,对我来说,大型机内部的CICS环境才是魔鬼。Jetty/Tomcat中没有类似的servletcontext,幸运的是它仍然支持axis2。因此,根据不同的用户指南,我决定将我的web服务归档到.aar中,并将其添加到services文件夹下。Axis2文件夹结构如下所示:

  • 存储库/
    • 模块
    • 服务
当我构建这个.aar归档文件时,我也在生成自己的wsdl,而不是使用axis2内置的wsdl生成器,后者根据services.xml生成给定类之外的服务(当我运行axis2服务器时,不使用,因为据我所知,axis2不喜欢JAX-WS注释)。为了初始化Spring框架,我需要编写初始化Springbeans的SpringInit类。不幸的是,出于某种原因,它还根据注释初始化了我的web服务类,然后占用了主端口(怀疑SpringInit自己初始化了web服务类,因为它也被定义为SpringBean,SpringInit扩展了Axis2类ServiceLifeCycle)我得到了JVM绑定异常,它声明地址已经在使用中。我希望根据存储在wsdl中的wsdl构建服务,而不是生成新的服务,因为我有各种环境:1)本地机器-Jetty 2)大型机。总之,我对我的services.xml进行了深入了解:

<service name="Absence" class="org.services.SpringInit">
<description>
    random description
</description>
<parameter name="ServiceTCCL">composite</parameter>
<parameter name="useOriginalwsdl" locked="false">true</parameter>
<parameter name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier</parameter>
<parameter name="ServiceClass">org.services.Absence</parameter>
<parameter name="SpringBeanName">absence</parameter>
<parameter name="SpringContextLocation">META-INF/applicationContextAar.xml</parameter>
</service>
现在我们转到org.services.idence.class,它是一个普通的JAX-WS web服务类,具有以下标题(包含JAX-WS注释):

包含这样的方法:

public class SpringInit implements ServiceLifeCycle {

public void startUp(ConfigurationContext ignore, AxisService service) {

    try {
        ClassLoader classLoader = service.getClassLoader();
        ClassPathXmlApplicationContext appCtx = new
        ClassPathXmlApplicationContext(new String[] {"applicationContextAar.xml"}, false);
            appCtx.setClassLoader(classLoader);
            appCtx.refresh();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

public void shutDown(ConfigurationContext ctxIgnore, AxisService ignore) {}
}
@WebMethod
@WebResult(name = "AbsenceResponse")
public SearchAbsenceRecordsResponse invokeSearchAbsenceRecords(
        @WebParam ServiceRequest request,
        @WebParam SearchAbsenceRecordsRequest absenceRequest) {...}
另一种方法是将“servicejars”文件夹添加到“repository”文件夹中,并用disposition.jar填充它,它的所有依赖项都位于子文件夹“lib”中。Axis2然后自动运行absense.jar,因为它有JAX-WS注释。但是在这里,当我调用web服务时,例如使用SOAP-UI,它没有初始化Spring,因为我不知道如何在该解决方案中初始化Spring。也许有人对此有专门知识

TL;DR

如何初始化Springbean,使其不会根据注释启动web服务类中的服务,而是根据wsdl构建服务


欢迎您提问。

我如何在没有servletcontext的情况下在CICS中初始化Spring

基本上直到今天,soapweb服务都是通过servicejars发布的,这意味着在repository文件夹中创建了“servicejars”文件夹,其中包含了从web服务类构建的jar。“servicejars”子文件夹“lib”包含web服务jar所需的所有依赖项

首先,我从web(Axis2主页,有一个关于Axis2和spring集成的说明)学习如何在我需要的Axis2 web服务中初始化spring。aar archive和在services.xml中定义的SpringInit服务。但是这带来了很多问题,因为在jaxws和jaxb上构建了旧的体系结构,因此非常需要重构web服务层。Axis2仅允许使用“servicejars”解决方案进行jaxws注释。使用SpringInit类初始化Spring意味着它根据应用程序上下文初始化springbean。现在它作为一个单独的web服务运行web服务bean(在前一篇文章中是缺席bean),并占用了8080端口,当根据WSDL创建web服务时,我得到了一个错误“JVM绑定地址已在使用”。因此,在此之后,我认为应该根据Springbean创建服务,并让axis2server生成WSDL,但axis2server不喜欢jaxws注释,即使没有它们,也不喜欢我的jaxb DTO

因此,我决定放弃.aar架构,回到“servicejars”架构。不幸的是,在那里我没有services.xml支持来定义潜在的SpringInit服务

由于jaxws web服务是唯一的入口点,因此我决定执行以下操作(在web服务层初始化SpringBean):

正如您所看到的,当调用这个类时,它将初始化applicationcontext,因为它是静态的,所以所有SpringBean都将保留在内存中直到结束(当服务关闭时)。在其他类中,自动连接工作得很好,不需要手动连接这些bean

最后,我没有发现像我希望的那样通过.aar架构初始化Spring的可能性,但我在一位高级程序员的指导下找到了解决办法。非常感谢他!现在,所有StackOverFlow用户都可以看到可能的解决方案

编辑:

在applicationContext.xml中,我有:

<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter"/>

尝试使用缺席.class(缺席bean)创建web服务。删除了它,因为我可以在本地机器中使用预先生成的WSDL和Jetty(最初用于在本地机器中创建web服务,就像我之前所说的,我有本地开发环境,它也应该与CICS兼容,现在它已经解决了)

@WebMethod
@WebResult(name = "AbsenceResponse")
public SearchAbsenceRecordsResponse invokeSearchAbsenceRecords(
        @WebParam ServiceRequest request,
        @WebParam SearchAbsenceRecordsRequest absenceRequest) {...}
@WebService(name = "AbsenceService", serviceName = "Absence", portName = "Absence",
targetNamespace = "http://www.something.org/Absence")
public class Absence extends ServiceHandlerBase { 

private static AbsenceFactory absenceFactory;

private static DataManagerFactory dataManagerFactory;

private static DataSetFactory dataSetFactory;

static {
    try {
        ClassPathXmlApplicationContext appCtx = new
        ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"}, false);
        appCtx.refresh();

        absenceFactory = (AbsenceFactory) appCtx.getBean("absenceFactory", AbsenceFactory.class);
        dataManagerFactory = (DataManagerFactory) appCtx.getBean("dataManagerFactory", DataManagerFactory.class);
        dataSetFactory = (DataSetFactory) appCtx.getBean("datasetFactory", DataSetFactory.class);

    } catch (Exception ex) {
        ex.printStackTrace();
    }

}


... 

}
<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter"/>