我正在开发一个以SpringBoot 1.4.1作为主框架的应用程序。该应用程序是一个Maven动态Web项目,它公开一些Web服务并连接到各种数据库。它使服务器和客户端都可以连接其他程序,如Microsoft Dynamics或AutoCad。
它可以作为某些应用程序和某些数据库之间的“走道”。
使用CXF 3.1.8开发Web服务,使用Spring JPA for CRUD方法和MyBatis进行数据库访问以进行复杂查询。
所有内容都是通过java clases和java bean配置的(没有使用xml配置文件)。
该应用程序在Spring boot嵌入式Tomcat(将其部署为Spring启动应用程序)和WebLogic 12c服务器(部署为maven-build war)中都能正常工作。
但是我对某些Web服务方法有一种奇怪的行为。具体来说,除删除方法外,所有方法都可以正常工作。
这是代码的一小部分。
我有一个java父类,它实现了Web服务共享的方法。然后我有两个或更多的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引导应用程序,也可以作为WebLogic中部署的jar文件o war文件。
但是,这个方法:
public ServiceResult deleteFoo(@WebParam(name = "foo") final Foo foo) {
return super.deleteFoo(foo);
}
如果我将应用程序部署为Spring启动应用程序,在嵌入式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中正常工作。
答案 0 :(得分:0)
以下链接https://axis.apache.org/axis2/java/core/docs/app_server.html适用于Axis,但似乎更适用于weblogic上的自定义战争。它声明
如果要部署自定义WAR,比如在集群环境中,则需要在模块和服务目录下的WEB-INF中分别添加两个名为“services.list”和“modules.list”的文件。 / p>
WEB-INF / services / services.list:应列出要公开的所有服务(aar文件)。 WEB-INF / modules / modules.list:应列出您要使用的所有模块(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模块。
在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>