簡體   English   中英

在SpringBoot CXF應用程序中使用@WebParam的WebLogic部署異常

[英]WebLogic deploy exception using @WebParam in SpringBoot CXF application

我正在開發一個以SpringBoot 1.4.1為主要框架的應用程序。 該應用程序是一個Maven動態Web項目,它公開了一些Web服務並連接到各種數據庫。 它同時容納服務器和客戶端,以與其他一些程序(例如Microsoft Dynamics或AutoCad)連接。

它充當某些應用程序和某些數據庫之間的“走道”。

Web服務使用CXF 3.1.8開發,Spring JPA用於CRUD方法訪問數據庫,而MyBatis用於復雜查詢。

一切都通過java clases和java bean配置(不使用xml配置文件)。

該應用程序在Spring Boot嵌入式Tomcat(部署為Spring Boot應用程序)和WebLogic 12c服務器(部署為Maven-Build War)中均能正常工作。

但是我對某些Web服務方法有一個奇怪的行為。 具體來說,除刪除方法外,所有方法都可以正常工作。

這是代碼的一小部分。

我有一個Java父類,該類實現了將由Web服務共享的方法。 然后,我有2個或更多擴展該父類並調用super.method()的Java類。

這里是父類:

@Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class)
public class FooService extends ServiceConfigurator {

    @Autowired
    protected FooRepository fooRepository;
    @Autowired
    protected FooMapper fooMapper;
    @Autowired
    protected FooFacade fooFacade;

    public ServiceResult persistFoo(final Foo foo) {
        this.getServiceResult();
        try {
            Foo result = this.fooFacade.persistFoo(foo, this.serviceResult);
            if (CollectionUtils.isEmpty(this.serviceResult.getErrors())) {
                result = this.fooMapper.findOne(result.getId());
                this.serviceResult.getResults().add(result);
                this.serviceResult.setSuccess(true);
            }
        } catch (final Exception e) {
            logger.error("ERROR", e);
            this.serviceResult.getErrors().addAll(Utils.addErrors(e));
            e.printStackTrace();
        }
        return this.serviceResult;
    }

    public ServiceResult deleteFoo(final Foo foo) {
        this.getServiceResult();
        try {
            final Helper helper = this.fooMapper.findById(helper.getId());
            final Foo existing = this.fooMapper.find(helper.getId(),     foo.getNumber(), foo.getVersion());
            this.fooFacade.deleteFoo(existing, this.serviceResult);
            if (CollectionUtils.isEmpty(this.serviceResult.getErrors())) {
                this.serviceResult.setSuccess(true);
            }
        } catch (final Exception e) {
            logger.error("ERROR", e);
            this.serviceResult.getErrors().addAll(Utils.addErrors(e));
            e.printStackTrace();
        }
        return this.serviceResult;
    }
}

這里是子類之一:

@Service("fooImpService ")
@WebService(serviceName = "FooImpService ")
public class FooImpService extends FooService {

    public ServiceResult createFoo(@WebParam(name = "foo") final Foo foo) {
        return super.persistFoo(foo);
    }

無論我在哪里部署我的應用程序,上述方法都可以正常工作,其他方法(例如)也可以:

@Transactional(readOnly = false)
public ServiceResult findId(@WebParam(name = "idOne") final String idOne, @WebParam(name = "idTwo") final String idTwo,
        @WebParam(name = "version") final String version) {
    this.getServiceResult();
    try {
        final Foo foo = this.fooMapper.findById(idOne);
        final Fooresult = this.fooMapper.findByVersion(foo.getId(), idTwo, version);
        if (result != null) {
            this.serviceResult.getResults().add(result.getId());
            this.serviceResult.setSuccess(true);
        }
    } catch (final Exception e) {
        logger.error("ERROR", e);
        this.serviceResult.getErrors().addAll(Utils.addErrors(e));
        e.printStackTrace();
    }
    return this.serviceResult;
}

這些方法既可以用作Spring Boot應用程序,也可以用作WebLogic中部署的jar文件或war文件。

但是然后,此方法:

public ServiceResult deleteFoo(@WebParam(name = "foo") final Foo foo) {
    return super.deleteFoo(foo);
}

如果將應用程序部署為春季啟動應用程序,則在嵌入式Tomcat中可以正常工作,但是當我嘗試將war部署到WebLogic時,出現以下異常:

Caused by: java.lang.NullPointerException:
    at com.sun.xml.ws.spi.db.JAXBWrapperAccessor.getPropertyAccessor(JAXBWrapperAccessor.java:261)
    at com.sun.xml.ws.db.toplink.JAXBContextWrapper.getElementPropertyAccessor(JAXBContextWrapper.java:170)
    at com.sun.xml.ws.server.sei.EndpointArgumentsBuilder$DocLit.<init>(EndpointArgumentsBuilder.java:598)
    at com.sun.xml.ws.server.sei.TieHandler.createArgumentsBuilder(TieHandler.java:143)
    at com.sun.xml.ws.server.sei.TieHandler.<init>(TieHandler.java:115)
    at com.sun.xml.ws.db.DatabindingImpl.<init>(DatabindingImpl.java:118)
    at com.sun.xml.ws.db.DatabindingProviderImpl.create(DatabindingProviderImpl.java:74)
    at com.sun.xml.ws.db.DatabindingProviderImpl.create(DatabindingProviderImpl.java:58)
    at com.sun.xml.ws.db.DatabindingFactoryImpl.createRuntime(DatabindingFactoryImpl.java:120)
    at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:521)
    at com.sun.xml.ws.server.EndpointFactory.create(EndpointFactory.java:300)
    at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:164)
    at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:577)
    at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:560)
    at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:639)
    at weblogic.wsee.jaxws.JAXWSDeployedServlet.getEndpoint(JAXWSDeployedServlet.java:355)
    at weblogic.wsee.jaxws.JAXWSServlet.registerEndpoint(JAXWSServlet.java:167)
    at weblogic.wsee.jaxws.JAXWSServlet.init(JAXWSServlet.java:79)
    at weblogic.wsee.jaxws.JAXWSDeployedServlet.init(JAXWSDeployedServlet.java:91)
    at javax.servlet.GenericServlet.init(GenericServlet.java:244)
    at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:343)
    at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:294)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:326)
    at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197)
    at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203)
    at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71)
    at weblogic.servlet.internal.StubSecurityHelper.initServletInstance(StubSecurityHelper.java:99)
    at weblogic.servlet.internal.StubSecurityHelper.createServlet(StubSecurityHelper.java:87)
    at weblogic.servlet.internal.StubLifecycleHelper.createOneInstance(StubLifecycleHelper.java:71)
    at weblogic.servlet.internal.StubLifecycleHelper.<init>(StubLifecycleHelper.java:57)
    at weblogic.servlet.internal.StubLifecycleHelper.<init>(StubLifecycleHelper.java:31)
    at weblogic.servlet.internal.ServletStubImpl.initStubLifecycleHelper(ServletStubImpl.java:673)
    at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:612)
    at weblogic.servlet.internal.WebAppServletContext.preloadServlet(WebAppServletContext.java:2054)
    at weblogic.servlet.internal.WebAppServletContext.loadServletsOnStartup(WebAppServletContext.java:2031)
    at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1920)
    at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:3091)
    at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1823)
    at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:882)
    at weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:360)
    at weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:356)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
    at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:138)

此異常可能是由於與@WebParam批注相關的某些原因引起的,因為當我從delete方法中刪除批注時,該應用已正確部署,並且該方法在WebLogic中可以正常工作。

以下鏈接https://axis.apache.org/axis2/java/core/docs/app_server.html用於Axis,但似乎更普遍地適用於Weblogic上的自定義戰爭。 它指出

如果要部署自定義WAR,例如在集群環境中,則需要在模塊和服務目錄下分別將兩個附加文件添加到WEB-INF中,分別名為“ services.list”和“ modules.list”。

WEB-INF / services / services.list:應該列出要公開的所有服務(AAR文件)。 WEB-INF / modules / modules.list:應該列出您要使用的所有模塊(mar文件)。

注意:在兩種情況下,請每行列出一個條目。

WebLogic附帶了與Axis2中存在的JAR沖突的JAR。 因此,用於確保從WEB-INF / lib中拾取了Axis2 WAR中打包的JAR。 您可以通過將WEB-INF / weblogic.xml中的元素設置為true來實現。 下面顯示了weblogic.xml的示例:

<weblogic-web-app>
     <container-descriptor>
         <prefer-web-inf-classes>true</prefer-web-inf-classes>
     </container-descriptor>
</weblogic-web-app>

如果設置為true,則該元素將強制WebLogic的類加載器優先於應用程序或系統類加載Web應用程序的WEB-INF目錄中的類。 這是推薦的方法,因為它只影響單個Web模塊。

對於CXF,類似的文檔位於http://cxf.apache.org/docs/application-server-specific-configuration-guide.html#ApplicationServerSpecificConfigurationGuide-WebLogic

在META-INF文件夾中創建一個weblogic-application.xml(特定於Weblogic)。

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
    <application-param>
        <param-name>webapp.encoding.default</param-name>
        <param-value>UTF-8</param-value>
    </application-param>
    <prefer-application-packages>
        <package-name>javax.jws.*</package-name>
    </prefer-application-packages>
</weblogic-application>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM