2017-02-14 158 views
2

我正在開發一個以SpringBoot 1.4.1爲主要框架的應用程序。該應用程序是一個Maven動態Web項目,它公開了一些Web服務並連接到各種數據庫。它擁有與Microsoft Dynamics或AutoCad等其他程序連接的服務器和客戶端。WebLogic在SpringBoot CXF應用程序中使用@WebParam部署異常

它用作一些應用程序和某些數據庫之間的「通道」。

Web服務是使用CXF 3.1.8開發的,數據庫訪問是使用CRUD方法的Spring JPA和用於複雜查詢的MyBatis完成的。

所有配置都通過java clases和java beans(不使用xml配置文件)。

該應用在Spring Boot Tomcat(部署爲Spring Boot應用)和WebLogic 12c服務器(部署爲maven-build war)中均可正常工作。

但我有一些奇怪的行爲與一些Web服務方法。特別是除了刪除方法之外,所有方法都可以正常工作

這是代碼的一小部分。

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

這裏父類:

@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啓動應用程序,jar文件或war文件部署在WebLogic中編輯。

不過呢,這個方法:如果我部署的應用程序如春啓動的應用程序

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

工作在嵌入式Tomcat的罰款,但是當我嘗試部署戰爭到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中正常工作。

+1

我在那裏春天啓動我的罐子和戰爭是工作的罰款和WLS我在那裏用JAXB它沒有工作了類似的問題,我才知道WLS使用自己的JAXBMarshaller,我已經添加了打包在META-INF中,並使用prefer-application-resources映射到weblogic.xml。我不認爲你的問題是一樣的,但也檢查這一行。 – user3428736

+0

看起來像上面評論中提到的階級衝突。 – ulab

+0

@ user3428736 您將什麼軟件包添加到weblogic.xml中? 在我的應用程序中,我有jaxb-core和jaxb-impl jar,但我不確定要添加什麼軟件包...也許是com.sun.xml? –

回答

0

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

如果要部署定製的戰爭,說在羣集環境中,你需要兩個額外的文件添加到名爲模塊下的「services.list」和「modules.list」的WEB-INF和服務目錄。

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

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

WebLogic附帶的JAR與Axis2中存在的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

創建WebLogic-application.xml中(具體的Weblogic)在META-INF文件夾。

<?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> 
+0

我已經爲log4j定義了類似的東西。我在WLS jar中遇到問題,所以我在weblogic.xml中添加了以下代碼: org.slf4j 我將測試該參數並告訴您發生了什麼。 謝謝。 –

+0

您的服務是否在services.list? – mikep

+0

不是。 我使用的是Apache CXF,並且所有配置都是通過java配置類完成的,我在其中定義了服務端點。服務列表在部署時生成。我可以看到並使用所有服務和所有服務方法,並且所有這些方法都可以使用@WebParam註釋工作,除了刪除方法。奇怪的行爲。 我認爲這個問題與WLS比其他任何事物有更多的關係,正如你之前提到的那樣。 –

相關問題