2012-10-02 20 views
8

Trascorro alcune ore cercando di integrare l'integrazione di Twitter con Spring Social utilizzando l'approccio di configurazione XML. Tutti gli esempi che ho trovato sul web (e su StackOverflow) utilizzano sempre l'approccio @Config come mostrato nella samplesCome configurare Spring Social tramite XML

Per qualsiasi motivo la definizione di fagioli per ottenere un'istanza al Twitter API genera un'eccezione AOP:

Caused by: java.lang.IllegalStateException: Cannot create scoped proxy for bean 'scopedTarget.twitter': Target type could not be determined at the time of proxy creation. 

Ecco il file di configurazione completa che ho:

<?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jaxrs="http://cxf.apache.org/jaxrs" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:cxf="http://cxf.apache.org/core" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
     http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd 
     http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
     http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd"> 

    <import resource="classpath:META-INF/cxf/cxf.xml" /> 
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> 

    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/DefaultDB" /> 

    <!-- initialize DB required to store user auth tokens --> 
    <jdbc:initialize-database data-source="dataSource" ignore-failures="ALL"> 
     <jdbc:script location="classpath:/org/springframework/social/connect/jdbc/JdbcUsersConnectionRepository.sql"/> 
    </jdbc:initialize-database> 

    <bean id="connectionFactoryLocator" 
     class="org.springframework.social.connect.support.ConnectionFactoryRegistry"> 
     <property name="connectionFactories"> 
      <list> 
       <ref bean="twitterConnectFactory" /> 
      </list> 
     </property> 
    </bean> 

    <bean id="twitterConnectFactory" class="org.springframework.social.twitter.connect.TwitterConnectionFactory"> 
     <constructor-arg value="xyz" /> 
     <constructor-arg value="xzy" /> 
    </bean> 

    <bean id="usersConnectionRepository" 
     class="org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository"> 
     <constructor-arg ref="dataSource" /> 
     <constructor-arg ref="connectionFactoryLocator" /> 
     <constructor-arg ref="textEncryptor" /> 
    </bean> 

    <bean id="connectionRepository" factory-method="createConnectionRepository" 
     factory-bean="usersConnectionRepository" scope="request"> 
     <constructor-arg value="#{request.userPrincipal.name}" /> 
     <aop:scoped-proxy proxy-target-class="false" /> 
    </bean> 

    <bean id="twitter" factory-method="findPrimaryConnection" 
     factory-bean="connectionRepository" scope="request" depends-on="connectionRepository"> 
     <constructor-arg value="org.springframework.social.twitter.api.Twitter" /> 
     <aop:scoped-proxy proxy-target-class="false" /> 
    </bean> 


    <bean id="textEncryptor" class="org.springframework.security.crypto.encrypt.Encryptors" 
     factory-method="noOpText" /> 

    <bean id="connectController" class="org.springframework.social.connect.web.ConnectController"> 
     <constructor-arg ref="connectionFactoryLocator"/> 
     <constructor-arg ref="connectionRepository"/> 
     <property name="applicationUrl" value="https://socialscn.int.netweaver.ondemand.com/socialspringdemo" /> 
    </bean> 

    <bean id="signInAdapter" class="com.sap.netweaver.cloud.demo.social.SimpleSignInAdapter" /> 

</beans> 

che enigmi me è che l'istanza connectionRepository funziona perfettamente bene (ho commentato-out il fagiolo twitter e testato il codice!)?!? Utilizza le stesse funzionalità: scope di richiesta e proxy AOP dell'interfaccia e funziona, ma l'istanziazione del bean twitter fallisce?!?

Il codice di configurazione sociale primavera appare come segue (non riesco a vedere alcuna differenza, vero?):

@Configuration 
public class SocialConfig { 

    @Inject 
    private Environment environment; 

    @Inject 
    private DataSource dataSource; 

    @Bean 
    @Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) 
    public ConnectionFactoryLocator connectionFactoryLocator() { 
     ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry(); 
     registry.addConnectionFactory(new TwitterConnectionFactory(environment.getProperty("twitter.consumerKey"), 
       environment.getProperty("twitter.consumerSecret"))); 
     return registry; 
    } 

    @Bean 
    @Scope(value="singleton", proxyMode=ScopedProxyMode.INTERFACES) 
    public UsersConnectionRepository usersConnectionRepository() { 
     return new JdbcUsersConnectionRepository(dataSource, connectionFactoryLocator(), Encryptors.noOpText()); 
    } 

    @Bean 
    @Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES) 
    public ConnectionRepository connectionRepository() { 
     Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
     if (authentication == null) { 
      throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in"); 
     } 
     return usersConnectionRepository().createConnectionRepository(authentication.getName()); 
    } 

    @Bean 
    @Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES) 
    public Twitter twitter() { 
     Connection<Twitter> twitter = connectionRepository().findPrimaryConnection(Twitter.class); 
     return twitter != null ? twitter.getApi() : new TwitterTemplate(); 
    } 

    @Bean 
    public ConnectController connectController() { 
     ConnectController connectController = new ConnectController(connectionFactoryLocator(), connectionRepository()); 
     connectController.addInterceptor(new PostToWallAfterConnectInterceptor()); 
     connectController.addInterceptor(new TweetAfterConnectInterceptor()); 
     return connectController; 
    } 

    @Bean 
    public ProviderSignInController providerSignInController(RequestCache requestCache) { 
     return new ProviderSignInController(connectionFactoryLocator(), usersConnectionRepository(), new SimpleSignInAdapter(requestCache)); 
    } 
} 

Qualsiasi aiuto/puntatori sarebbe apprezzato !!!

risposta

5

Ho una configurazione che ha funzionato per l'integrazione di Spring Social Facebook. (Ho configurazione Twitter in essa, ma non ho ancora testato la parte Twitter in esso)

<bean class="org.springframework.social.connect.web.ProviderSignInController"> 
<!-- relies on by-type autowiring for the constructor-args -->  
<constructor-arg ref="signInAdapter" /> 
</bean> 

<bean id="connectionFactoryLocator" 
    class="org.springframework.social.connect.support.ConnectionFactoryRegistry"> 
<property name="connectionFactories"> 
    <list> 
     <bean class="org.springframework.social.twitter.connect.TwitterConnectionFactory"> 
      <constructor-arg value="${twitter.consumerKey}" /> 
      <constructor-arg value="${twitter.consumerSecret}" />    
     </bean> 
     <bean class="org.springframework.social.facebook.connect.FacebookConnectionFactory"> 
      <constructor-arg value="${facebook.clientId}" /> 
      <constructor-arg value="${facebook.clientSecret}" />     
     </bean> 
    </list> 
</property> 
</bean> 

<bean id="connectionRepository" factory-method="createConnectionRepository" 
    factory-bean="usersConnectionRepository" scope="request"> 
<constructor-arg value="#{request.userPrincipal.name}" /> 
<aop:scoped-proxy proxy-target-class="false" /> 
</bean> 

<bean id="signInAdapter" class="com.test.social.SimpleSignInAdapter"/> 

<bean id="usersConnectionRepository" 
    class="org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository"> 
<constructor-arg ref="dataSource" /> 
<constructor-arg ref="connectionFactoryLocator" /> 
<constructor-arg ref="textEncryptor" /> 
</bean> 

<bean id="textEncryptor" class="org.springframework.security.crypto.encrypt.Encryptors" 
     factory-method="noOpText" /> 

ho in primo luogo di cui la documentation, che è abbastanza piccolo da leggere e un tutorial che aveva più a che fare con l'integrazione con sicurezza di primavera. Spero che questo aiuti in qualche modo.

+0

Bene, come ho detto ... la documentazione ufficiale non include la parte mancante alla quale la mia domanda era correlata. L'app spring-social-showcase utilizza la configurazione basata su annotazione @Config. Il tuo esempio non include anche la definizione mancante di parte del bean di "twitter", ma grazie per aver provato comunque! Saluti! –

0

Ho una configurazione xml molla-mvc/spring-social per tomcat7 in this question I posted.

Questa domanda è stata inviata molto tempo fa, ma forse la configurazione nel mio post salverà alcune persone un po 'di tempo. Mi ci è voluto un po 'di tempo per impostare con la configurazione XML e l'ultimo MVC di primavera 4.2.4 incluso spring-social (1.1.4) e spring-social-twitter (1.1.2). Scrivo qui le versioni, perché ci sono diverse cose diverse tra le versioni di primavera.