1

我目前正面临将 CXF Web 服务与 Spring @Configurable注释混合的问题。

从一方面来看,我的 CXF Web 服务可以正常工作并配置如下:

<import resource="classpath:some-other-context.xml" />

<jaxws:server id="Init"
        serviceClass="package.to.my.ServiceInterface"
        address="/">
        <jaxws:serviceBean>
            <bean class="package.to.my.BADematInitImpl">
            </bean>
        </jaxws:serviceBean>
</jaxws:server>

<context:spring-configured />

在我的some-other-context.xml中是我的 Spring 配置,其中包含以下 Bean:

@Configurable(autowire = Autowire.BY_TYPE)
public class MyConfigurable {

    @Autowired(required=true)
    private A a;

    @Autowired(required=true)
    private B b;

    @Autowired(required=true)
    private C c;

...

}

但是,当我尝试在我的服务中创建 MyConfigurable bean 的新实例时,由于 null 值假定自动装配的 A、B 和 C 对象,我得到了NullPointerException 。

任何的想法 ?

4

2 回答 2

1

@ConfigurableAOP加载时间编织的东西使用的标记。我假设您没有使用任何 AOP,因为在您的问题中没有提到它。第二件事:您不必像默认值那样required=true@Autowired注释中使用. 我建议您像这样更改代码:truerequired

将这些添加到您的 spring 配置文件中的元素中:

<context:component-scan base-package="your.pckg.toscan"/>

文档说:

扫描类路径以查找将自动注册为 Spring bean 的注释组件。默认情况下,将检测 Spring 提供的 @Component、@Repository、@Service 和 @Controller 构造型。

<context:annotation-config/>

文档说:

激活要在 bean 类中检测的各种注释:Spring 的 @Required 和 @Autowired,以及 JSR 250 的 @PostConstruct、@PreDestroy 和 @Resource(如果可用)、JAX-WS 的 @WebServiceRef(如果可用)、EJB3 的 @EJB(如果可用),以及 JPA 的 @PersistenceContext 和 @PersistenceUnit(如果可用)。或者,您可以选择为这些注释激活单独的 BeanPostProcessor。

因此,将您的代码更改为:

@Component
public class MyConfigurable {

    @Autowired
    private A a;

    @Autowired
    private B b;

    @Autowired
    private C c;

...

}

一切都应该正常工作。

于 2013-02-07T08:15:45.273 回答
0

我终于发现了问题所在。

我需要将此配置添加到我的第三方应用程序 XML 文件中:

<context:load-time-weaver/>

...并将此参数添加到我的jvm 启动命令行

-javaagent:"path\to\my\spring-agent.jar"

它就像一个魅力。

我知道这是因为 Spring 在某些时候需要一个实体来管理其 AOP 部分,以便很好地注入依赖项。如果有人有进一步的解释会很有趣。

于 2013-02-07T09:31:27.447 回答