Tomcatエンジンには、実行時にアクセスしたい情報があるため、アプリのコンテキストには次の情報があります(このブログ投稿からこれを取得しました)。
<bean id="tomcatEngineProxy" class="org.springframework.jmx.access.MBeanProxyFactoryBean">
<property name="objectName" value="Catalina:type=Engine" />
<property name="proxyInterface" value="org.apache.catalina.Engine" />
<property name="useStrictCasing" value="false" />
</bean>
コントローラでは、次のように自動配線します。
@Autowired
private MBeanProxyFactoryBean tomcatEngineProxy = null;
org.apache.catalina.Engine
そのクラスはビルド時に利用できないため、ブログ投稿のように接続することはできません。実行時にのみ利用可能であり、すべての異なるTomcatバージョンが異なるマシンで実行されています。
リフレクションを使用して、この@Autowireから必要な情報を取得することができました。ここで、この機能をサービスに移動します。これをアプリのコンテキストに追加しました:
<bean id="myService" class="com.foo.bar.MyServiceImpl">
<constructor-arg ref="tomcatEngineProxy" />
</bean>
そして、クラスは次のようになります。
public class MyServiceImpl implements MyService
{
public MyServiceImpl(MBeanProxyFactoryBean tomcatEngineProxy) throws Exception
{
//stuff with the proxy
}
.....
}
これを行うと、次のエラーが発生します。
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myService' defined in ServletContext resource [/WEB-INF/spring/root-context.xml]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.springframework.jmx.access.MBeanProxyFactoryBean]: Could not convert constructor argument value of type [$Proxy44] to required type [org.springframework.jmx.access.MBeanProxyFactoryBean]: Failed to convert value of type '$Proxy44 implementing org.apache.catalina.Engine,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'org.springframework.jmx.access.MBeanProxyFactoryBean'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy44 implementing org.apache.catalina.Engine,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [org.springframework.jmx.access.MBeanProxyFactoryBean]: no matching editors or conversion strategy found
プロキシがどのように機能し、どのように使用するかについては基本的に何も知らないので、この機能をどのように実行するかはわかりません。一致するコンストラクター引数に使用できる宣言はありますか?動作するコントローラーの@Autowireと動作しないコンストラクターargの違いは何ですか?