hay alguna información en el motor Tomcat que queremos acceder tiempo de ejecución, por lo que tenemos el siguiente en nuestro contexto aplicación (consiguió esto desde this blog post):¿Cómo se inyecta un proxy en un servicio?
<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>
En un controlador, que a continuación autowired en de esta manera:
@Autowired
private MBeanProxyFactoryBean tomcatEngineProxy = null;
no podemos alambre en org.apache.catalina.Engine
al igual que en la entrada del blog, porque esa clase no está disponible para nosotros en tiempo de compilación. Solo está disponible en tiempo de ejecución con todas las diferentes versiones de tomcat que se ejecutan en las diferentes máquinas.
Pudimos obtener la información que necesitábamos de este @Autowire usando la reflexión. Ahora, queremos mover esta funcionalidad a un servicio. He añadido esto a nuestro contexto aplicación:
<bean id="myService" class="com.foo.bar.MyServiceImpl">
<constructor-arg ref="tomcatEngineProxy" />
</bean>
Y la clase tiene este aspecto:
public class MyServiceImpl implements MyService
{
public MyServiceImpl(MBeanProxyFactoryBean tomcatEngineProxy) throws Exception
{
//stuff with the proxy
}
.....
}
Cuando hago esto, me sale el siguiente error:
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
Conocer básicamente nada acerca de cómo funcionan los proxies y cómo usarlos, no estoy seguro de cómo hacerlo funcionar. ¿Hay alguna declaración que pueda usar para mi constructor arg que coincida? ¿Qué hay de diferente entre @Autowire en el controlador que funciona y el constructor arg que no funciona?
¡Perfecto! Trabajado como un encanto. No he visto esa sintaxis antes. Tenía que hacerlo así: ' ', pero eso solo es cuestión de hacer feliz al XML. ¡Gracias! –
dnc253
np. simplemente no intentes eso en una expresión EL, ya que está rota :) Tengo un error en la primavera para eso. – Matt