【问题标题】:CXF and Spring @Configurable issueCXF 和 Spring @Configurable 问题
【发布时间】:2013-02-06 16:06:42
【问题描述】:

我目前正面临将 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 的新实例时,我得到一个 NullPointerException 由于 null 值应该自动装配的 A、B 和 C 对象。

有什么想法吗?

【问题讨论】:

  • A、B、C bean 是否正在创建?您是否使用过 或任何其他生成 bean 的方式?
  • 是的,因为当我以编程方式获得 Spring 上下文时,我可以看到它们。

标签: web-services spring cxf configurable


【解决方案1】:

@ConfigurableAOP load-time-weaving 使用的标记。我假设您没有使用任何 AOP,因为在您的问题中没有提到它。第二件事:您不必在@Autowired 注释中使用required=true,因为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;

...

}

一切正常。

【讨论】:

  • 您好 Paulius,感谢您的回答。我已经设置了您上面提到的 XML 配置,并将 MyConfigurable 类的注释从 \@Configurable 更改为 \@Component 并没有成功。
【解决方案2】:

我终于发现了问题。

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

<context:load-time-weaver/>

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

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

它就像一个魅力。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多