【问题标题】:How to make a web service implement a library based interface?如何使 Web 服务实现基于库的接口?
【发布时间】:2013-10-31 12:17:11
【问题描述】:

在我正在处理的一个项目中,我们有几个 servlet,它们都使用一个通用 API(由我们开发)来访问数据库等。这个想法是逐渐从共享的 jar 文件中取出这个功能,并将它放在一个 JAX-WS Web 服务中以供外部应用程序使用。但是,当我们使用 spring 初始化我们的 servlet 时,我现在遇到了困难,并且在 jar 中定义的接口和 Web 服务生成的类之间存在类型不匹配,即使它们具有相同的包和名称。

经过进一步检查,似乎发生了一些我可以看到阻碍的事情:

  1. 从 Web 服务生成的源包含它自己的接口版本
  2. 生成的实现源从未真正实现接口,它只是根据请求返回接口类型的对象
    • 此方法不是静态的,但我可以想象会产生问题
  3. 我确实记得读过 JAX-B 不能真正处理接口,但这是我在创建方法时发现的,因此可能不适用于本节

考虑到这一点,我似乎需要在 spring 中通过调用生成的 web 服务方法来构造一个 bean,但我不知道如何。任何其他建议都非常受欢迎,因为删除接口对于测试/可扩展性是不可取的,我能想到的唯一其他解决方案是在构造函数而不是 spring 中分配这个类。

提前致谢!

【问题讨论】:

    标签: spring interface jax-ws


    【解决方案1】:

    如果另一个bean没有用@Primary注释你的用@Primary注释

    表示当多个候选者有资格自动装配单值依赖项时,应优先考虑 bean。如果候选中恰好存在一个“主要”bean,它将是自动装配的值。这个注解在语义上等同于 Spring XML 中元素的主要属性。

    可用于任何直接或间接使用@Component 注释的类或使用@Bean 注释的方法。

    http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/context/annotation/Primary.html

    【讨论】:

      【解决方案2】:

      找到了通过请求提取实现对象的方法。通过使用MethodInvokingFactoryBean,您可以设置一个实例并存储结果,以便像任何普通 bean 一样使用。

      例子:

      <bean id="implementingObject" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" autowire="byName">
          <property name="targetClass">
              <value>JAXWSServiceClass</value>
          </property>
          <property name="targetMethod">
              <value>getInterfacePortObject</value>
          </property>
      </bean>
      

      【讨论】:

        猜你喜欢
        • 2020-08-22
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        相关资源
        最近更新 更多