2012-09-19 19 views
5

biz çalışma süresini erişmek istediğiniz tomcat motorunda bazı bilgiler vardır, bu yüzden bizim uygulama bağlamında şu var (this blog post bu var): Bir denetleyici olarakBir proxy'yi bir hizmete nasıl enjekte edersiniz?

<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> 

, biz o zaman bunu autowired böyle: o sınıf inşa anda bize kullanılamadığı için

@Autowired 
private MBeanProxyFactoryBean tomcatEngineProxy = null; 

Biz, blog yazısında gibi org.apache.catalina.Engine tel olamaz. Farklı makinelerde çalışan tüm farklı tomcat sürümleriyle sadece çalışma zamanında kullanılabilir.

Biz yansıma kullanarak bu @Autowire den gerekli bilgileri almak başardık. Şimdi, bu işlevselliği bir servise taşımak istiyoruz. Bizim app bağlamında bu ekledi:

<bean id="myService" class="com.foo.bar.MyServiceImpl"> 
    <constructor-arg ref="tomcatEngineProxy" /> 
</bean> 

Ve sınıf şuna benzer:

public class MyServiceImpl implements MyService 
{ 
    public MyServiceImpl(MBeanProxyFactoryBean tomcatEngineProxy) throws Exception 
    { 
     //stuff with the proxy 
    } 
    ..... 
} 

Bunu yaptığınızda, aşağıdaki hatayı alıyorum:

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 

temelde hiçbir şey bilmeden Vekillerin nasıl çalıştığı ve nasıl kullanılacağı ile ilgili olarak, bu çalışmayı nasıl yapacağımızdan emin değilim. Eşleştirecek kurucu argümde kullanabileceğim bir bildirim var mı? Denetleyicideki @Autowire ile çalışmayan yapıcı arg arasında ne farklıdır?

cevap

4

sizin fabrika fasulye motoru arayüzü gibi bir sonuç ortaya da ondan: Eğer "tomcatEngineProxy" fasulye kendisinde tel denerseniz

<property name="proxyInterface" value="org.apache.catalina.Engine" /> 

Yani, yalnızca uyumlu bir görev "org.apache etmektir. catalina.Engine ", yaratılan proxy sadece bu arabirimi uygular.

(nesnenin kendisi yerine nesneyi oluşturan gerçek fabrika fasulye bulmak için sözdizimi ve işareti fark) yerine doğrudan fabrika fasulye başvuran deneyin: Ben de belirtildiği gibi

<constructor-arg ref="&tomcatEngineProxy" /> 

How to inject FactoryBean instead of object it produces?

+0

Mükemmel! Bir çekicilik gibi çalıştı. Bu sözdizimini daha önce görmedim. Bunu şöyle yapmam gerekiyordu: ', ancak bu XML'i mutlu etmenin bir meselesi. Teşekkürler! – dnc253

+0

np. Sadece bir EL ifadesinde kırılmış olarak denemeyin :) Bunun için ilkbaharda bir hatam var. – Matt

0

Ben Bean (yani MBeanProxyFactoryBean) türüne göre bağlayıcı beri @Autowired eserler yapılır inanıyoruz ancak yapıcı argüman bağlanarak adıyla yapılır ve tomcatEngineProxy sağlanan adı, beklemeniz türüyle eşleşmiyor bir FactoryBean kullanılarak oluşturulan bir fasulye türü beri FactoryBean daha farklıdır. En basit çözüm gibi görünüyor

MyServiceImpl olmak değiştirmek olacaktır:

public class MyServiceImpl implements MyService 
{ 
    @Autowired 
    private MBeanProxyFactoryBean tomcatEngineProxy; 

    public MyServiceImpl() throws Exception 
    { 
     //stuff with the proxy 
    } 
    ..... 
} 

Bu hile yapmak gerekir.

+0

yukarıda, org.apache.catalina.Engine, yapım aşamasında mevcut değil. Bunu sağlamak, bize inşa edilen tomcat versiyonunu bize bağlayacak ve farklı sunucularda çalışan tomcat versiyonlarına sahibiz. Nasıl olduğunu bilmiyorum, ama denetleyicideki otomatik kablolama kesinlikle işe yaradı. dnc253 @ – dnc253

+0

: Üzgünüz - Ben söz o kısmını kaçırdım. – RonK

İlgili konular