6

私は次のように設定しましたSpring Application Context


@Configuration
public class RmiContext {
@Bean
    public RmiProxyFactoryBean service() {
        RmiProxyFactoryBean rmiProxy = new RmiProxyFactoryBean();
        rmiProxy.setServiceUrl("rmi://127.0.1.1:1099/Service");
        rmiProxy.setServiceInterface(Service.class);
        return rmiProxy;
    }
}


@Configuration
public class LocalContext {
@Bean
    public Controller Controller() {
        return new ControllerImpl();
    }
}


@Configuration
@Import({RmiContext.class, LocalContext.class})
public class MainContext {

}

上記のセットアップは正常に機能しますが、 を使用して 1 つずつ宣言すると面倒なアプリケーションにが多数あるため、 で@ComponentScan注釈Controllerを付けることができるようにしたいと考えています。@ComponentController@Bean


@Configuration
@ComponentScan(basePackageClasses = {Controller.class})
public class LocalContext {
    /* ... */
}
問題は、私がそうする@ComponentScan(basePackageClasses = {Controller.class})と、以前の正常な動作RmiProxyFactoryBeanが認識されないか、作成できないことです。

MainContextでは、 RMI 経由の Bean とローカル Bean の両方が作成されるように構成するにはどうすればよいでしょうか?

4

3 に答える 3

2

@Configuration もコンポーネント スキャンの候補であるため、次の方法で RmiContext 内のすべての Bean とコントローラー パッケージ内のすべてのコントローラーをスキャンできます。

@Configuration
@ComponentScan(basePackages = {"org.example.controllers", "package.of.RmiContext"})
public class MainContext {
}

- 編集 -

@Configuration はコンポーネント スキャンの候補です。これが私の PC で動作するテスト ケースです。

package scan.controllers;
@Controller
public class ExampleController {
}

package scan;
public interface RMIService {
}

package scan;
@Configuration
public class RmiContext {
    @Bean
    public RmiProxyFactoryBean service() {
        RmiProxyFactoryBean rmiProxy = new RmiProxyFactoryBean();
        rmiProxy.setServiceUrl("rmi://127.0.1.1:1099/Service");
        rmiProxy.setServiceInterface(RMIService.class);
        rmiProxy.setLookupStubOnStartup(false);
        return rmiProxy;
    }
}

package scan;
@Configuration
//MainContext will auto scan RmiContext in package scan and all controllers in package scan.controllers
@ComponentScan(basePackages = {"scan", "scan.controllers"})
public class MainContext {
}

package scan;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={MainContext.class})
public class TestContext {

    @Autowired private RMIService rmi;
    @Autowired private ExampleController controller;

    @Test
    public void test() {
        //both controller and rmi service are autowired as expected
        assertNotNull(controller);
        assertNotNull(rmi);
    }
}
于 2013-08-02T01:37:46.780 に答える
1

クラス (RMI、コントローラー) の基本パッケージを使用してみてください:


@ComponentScan(basePackages = {"your controller package", "your rmi package"})

RMI クラス パッケージがコントローラーと異なる場合、Spring によるインスタンス化に失敗します。

于 2013-07-29T14:38:22.690 に答える
0

私があなたを正しく理解していれば、「@ComponentScan(basePackageClasses」を使用していますが、Spring Bean を検出して登録していませんか?

数分前に同じ問題がありました。私はあきらめず、すべての面白い推測を試みました。1つの推測でそれができました。

XML に XML コンポーネント スキャン エントリを追加する必要がありました。以下のように、そこにダミーパッケージを配置しました。

 component-scan base-package="dummy.filler.to.enable.component.scan"

XML の component-scan で @ComponentScan が有効になっているようです。

[後期編集: 気付きました、私の春の xml スキーマは春 2.5 です。とにかく、これが重要かどうかはわかりません。よろしくお願いします。]

于 2015-03-31T07:41:15.977 に答える