2012-10-02 36 views
8

Tôi dành một vài giờ cố gắng tích hợp Twitter để làm việc với Spring Social bằng cách sử dụng phương pháp cấu hình XML. Tất cả các ví dụ tôi có thể tìm thấy trên web (và trên stackoverflow) luôn luôn sử dụng cách tiếp cận @Config như trong samplesCách cấu hình Spring Social qua XML

Đối với bất cứ lý do định nghĩa bean để có được một ví dụ để các API twitter ném một ngoại lệ 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. 

Dưới đây là các tập tin cấu hình hoàn chỉnh tôi có:

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

tôi câu đố gì được rằng connectionRepository instantiation làm việc hoàn toàn tốt đẹp (tôi nhận xét-ra đậu twitter và thử nghiệm mã!)?!? Nó sử dụng các tính năng tương tự: yêu cầu phạm vi và giao diện AOP proxy và các công trình, nhưng twitter đậu instantiation không?!?

Mùa xuân đang cấu hình xã hội trông như sau (tôi không thể nhìn thấy bất kỳ sự khác biệt, có thể giúp bạn?):

@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)); 
    } 
} 

Bất kỳ sự giúp đỡ/con trỏ sẽ được đánh giá !!!

Trả lời

5

Tôi có cấu hình hoạt động cho tích hợp Facebook trên mạng xã hội. (Tôi có cấu hình twitter trong nó, Nhưng tôi đã không kiểm tra phần twitter trong nó)

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

Tôi đã chủ yếu gọi các documentation đó là đủ nhỏ để đọc và một tutorial trong đó có nhiều việc phải làm với hội nhập với an ninh mùa xuân. Tôi hy vọng việc này sẽ có ích trong vài trường hợp.

+0

Vâng, như tôi đã nói ... tài liệu chính thức không bao gồm phần còn thiếu mà câu hỏi của tôi có liên quan đến. Ứng dụng trình diễn xã hội-mùa xuân sử dụng cấu hình dựa trên chú thích @Config. Ví dụ của bạn không bao gồm định nghĩa của phần còn thiếu của "twitter" - cũng vậy, nhưng cảm ơn bạn đã cố gắng! Chúc mừng! –

0

Tôi có cấu hình spring-mvc/spring-social xml hoạt động cho tomcat7 ở this question I posted.

Câu hỏi này đã được đăng một thời gian dài trước đây nhưng có lẽ cấu hình trong bài đăng của tôi sẽ tiết kiệm một số người một thời gian. Tôi đã mất khá nhiều thời gian để thiết lập cấu hình XML và mới nhất là 4.2.4 MVC vào mùa xuân, bao gồm kết nối twitter mùa xuân-xã hội (1.1.4) và mùa xuân-xã hội-twitter (1.1.2). Tôi viết các phiên bản ở đây, bởi vì có khá nhiều điều khác nhau giữa các phiên bản mùa xuân.

Các vấn đề liên quan