gpt4 book ai didi

java - 为什么 JAXB 试图绑定(bind) Spring 的 ApplicationContext?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:01:16 25 4
gpt4 key购买 nike

我正在开发一个公开 JAX-WS Web 服务的 Spring 应用程序。 Web 服务实现依赖于我的服务层中的一些 spring 管理的对象,看起来像这样

@WebService
public class BlahService {
...
public void setFooService(FooService f) {
...
}
}

其中 FooService 在应用程序上下文中定义,并在 webapp 启动期间注入(inject)到 BlahService 中。 FooService 本身依赖于 BarService,它再次在应用程序上下文中定义并在启动时注入(inject),因此 BlahService 高于 transitively 依赖于 BarService

这是他棘手的部分。 BarService 实现了 ApplicationContextAware,因此它的代码类似于通常的代码

public class BazService implements ApplicationContextAware {

private ApplicationContext applicationContext;

public final void setApplicationContext(ApplicationContext ctx) {
this.applicationContext = ctx;
}
...
}

现在除非我用 @XmlTransient 注释 setApplicationContext 应用程序不会启动,提示 applicationContext 是一个接口(interface)因此不可能绑定(bind)到 JAXB。我错过了什么?为什么 JAXB 试图将 ApplicationContext 绑定(bind)到 XML?

堆栈跟踪或它没有发生

####<Jun 22, 2011 7:28:31 PM CEST> <Info> <ServletContext-/MyApp> <duck> <myserver> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1308763711259> <BEA-000000> <Initializing Spring root WebApplicationContext> 
####<Jun 22, 2011 7:28:32 PM CEST> <Error> <HTTP> <duck> <myserver> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1308763712595> <BEA-101216> <Servlet: "myApp-jax-ws-servlet" failed to preload on startup in Web application: "MyApp.war".
javax.xml.ws.WebServiceException: Unable to create JAXBContext
at com.sun.xml.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:164)
at com.sun.xml.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:94)
at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:281)
at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:363)
at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:202)
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:496)
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:539)
at weblogic.wsee.jaxws.JAXWSDeployedServlet.getEndpoint(JAXWSDeployedServlet.java:183)
at weblogic.wsee.jaxws.JAXWSServlet.registerEndpoint(JAXWSServlet.java:135)
at weblogic.wsee.jaxws.JAXWSServlet.init(JAXWSServlet.java:64)
at weblogic.wsee.jaxws.JAXWSDeployedServlet.init(JAXWSDeployedServlet.java:54)
at javax.servlet.GenericServlet.init(GenericServlet.java:241)

... lots of weblogic stuff ...

Caused By: java.security.PrivilegedActionException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
org.springframework.context.ApplicationContext is an interface, and JAXB can't handle interfaces.
this problem is related to the following location:
at org.springframework.context.ApplicationContext
at public final org.springframework.context.ApplicationContext my.package.myApp.service.db.DBManager.getApplicationContext()
at my.package.myApp.service.db.DBManager
at public my.package.myApp.service.db.DBManager my.package.myApp.service.sso.SSOInterface.getDBManager()
at my.package.myApp.service.sso.SSOInterface
at public my.package.myApp.service.sso.SSOInterface my.package.myApp.ws.inBound.jaxws.SetSsoInterface.arg0
at my.package.myApp.ws.inBound.jaxws.SetSsoInterface
org.springframework.context.ApplicationContext does not have a no-arg default constructor.
this problem is related to the following location:
at org.springframework.context.ApplicationContext
at public final org.springframework.context.ApplicationContext my.package.myApp.service.db.DBManager.getApplicationContext()
at my.package.myApp.service.db.DBManager
at public my.package.myApp.service.db.DBManager my.package.myApp.service.sso.SSOInterface.getDBManager()
at my.package.myApp.service.sso.SSOInterface
at public my.package.myApp.service.sso.SSOInterface my.package.myApp.ws.inBound.jaxws.SetSsoInterface.arg0
at my.package.myApp.ws.inBound.jaxws.SetSsoInterface

at java.security.AccessController.doPrivileged(Native Method)
at com.sun.xml.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:151)
at com.sun.xml.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:94)
at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:281)
at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:363)
at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:202)
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:496)
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:539)
at weblogic.wsee.jaxws.JAXWSDeployedServlet.getEndpoint(JAXWSDeployedServlet.java:183)
at weblogic.wsee.jaxws.JAXWSServlet.registerEndpoint(JAXWSServlet.java:135)
at weblogic.wsee.jaxws.JAXWSServlet.init(JAXWSServlet.java:64)
at weblogic.wsee.jaxws.JAXWSDeployedServlet.init(JAXWSDeployedServlet.java:54)
at javax.servlet.GenericServlet.init(GenericServlet.java:241)

... lots of weblogic stuff again ...

Caused By: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
org.springframework.context.ApplicationContext is an interface, and JAXB can't handle interfaces.
this problem is related to the following location:
at org.springframework.context.ApplicationContext
at public final org.springframework.context.ApplicationContext my.package.myApp.service.db.DBManager.getApplicationContext()
at my.package.myApp.service.db.DBManager
at public my.package.myApp.service.db.DBManager my.package.myApp.service.sso.SSOInterface.getDBManager()
at my.package.myApp.service.sso.SSOInterface
at public my.package.myApp.service.sso.SSOInterface my.package.myApp.ws.inBound.jaxws.SetSsoInterface.arg0
at my.package.myApp.ws.inBound.jaxws.SetSsoInterface
org.springframework.context.ApplicationContext does not have a no-arg default constructor.
this problem is related to the following location:
at org.springframework.context.ApplicationContext
at public final org.springframework.context.ApplicationContext my.package.myApp.service.db.DBManager.getApplicationContext()
at my.package.myApp.service.db.DBManager
at public my.package.myApp.service.db.DBManager my.package.myApp.service.sso.SSOInterface.getDBManager()
at my.package.myApp.service.sso.SSOInterface
at public my.package.myApp.service.sso.SSOInterface my.package.myApp.ws.inBound.jaxws.SetSsoInterface.arg0
at my.package.myApp.ws.inBound.jaxws.SetSsoInterface

at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:478)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:308)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1149)
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:169)
at com.sun.xml.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:160)
at com.sun.xml.ws.developer.JAXBContextFactory$1.createJAXBContext(JAXBContextFactory.java:74)
at com.sun.xml.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:159)
at com.sun.xml.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:151)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.xml.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:151)
at com.sun.xml.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:94)
at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:281)
at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:363)
at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:202)
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:496)
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:539)
at weblogic.wsee.jaxws.JAXWSDeployedServlet.getEndpoint(JAXWSDeployedServlet.java:183)
at weblogic.wsee.jaxws.JAXWSServlet.registerEndpoint(JAXWSServlet.java:135)
at weblogic.wsee.jaxws.JAXWSServlet.init(JAXWSServlet.java:64)
at weblogic.wsee.jaxws.JAXWSDeployedServlet.init(JAXWSDeployedServlet.java:54)
at javax.servlet.GenericServlet.init(GenericServlet.java:241)

... more weblogic stuff ...

最佳答案

默认情况下,JAXB 实现将映射所有公共(public)字段和属性。您可以使用 @XmlTransient 注释来防止属性被映射:

@XmlTransient
public void setFooService(FooService f) {
...
}

关于java - 为什么 JAXB 试图绑定(bind) Spring 的 ApplicationContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6447126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com