2015-04-03 2 views
1

Для Spring Social version 1.1.0.RELEASE мне нужно настроить приложение Url для ProviderSignInController, так как мое приложение (приложение Tomcat) размещено за прокси-сервером (Apache-сервером). Согласно с Spring Social document, я поставил его, как показано ниже:Исходное событие Spring Social appURL

<bean id="providerSignInController" 
    class="org.springframework.social.connect.web.ProviderSignInController"> 
    <property name="signInUrl" value="/accounts/login" /> 
    <property name="signUpUrl" value="/accounts/signup" /> 
    <property name="postSignInUrl" value="/accounts/profile" /> 
    <property name="applicationUrl" value="${applicationUrl}" /> 
</bean> 

Однако при развертывании приложения, я получаю исключение в Tomcat catalina.out говоря:

PropertyAccessException 1: 
org.springframework.beans.MethodInvocationException: Property 
'applicationUrl' threw exception; nested exception is 
java.lang.NullPointerException>org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 
'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0' 
defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: 
Initialization of bean failed; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'providerSignInController' defined in ServletContext 
resource [/WEB-INF/spring-servlet.xml]: Error setting property values; 
nested exception is 
org.springframework.beans.PropertyBatchUpdateException; nested 
PropertyAccessExceptions (1) are: 
PropertyAccessException 1: 
org.springframework.beans.MethodInvocationException: Property 
'applicationUrl' threw exception; nested exception is 
java.lang.NullPointerException 
     at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) 

Любые предложения, пожалуйста? Благодарю.

+0

Вы уже настроили 'applicationUrl' в своих свойствах? –

+0

Да, как рекомендовано Весенним социальным документом (http://docs.spring.io/spring-social/docs/1.1.0.RELEASE/reference/htmlsingle/#enabling-provider-sign-in-with-code- providerignincontroller-code), значение URL-адреса приложения вытесняется в файле свойств. Кстати, если я не настрою свойство applicationUrl в объявлении поставщика bean providerSignInController, этот компонент может быть создан без проблем. То есть, нет проблем со свойствами signInUrl, signUpUrl и postSignInUrl. – Yuci

+0

Тогда вы могли бы показать нам файл свойств, а также как настроить весну для чтения файла свойств? ну другие свойства (такие как signInUrl, signUpUrl) не имеют проблем, потому что вы устанавливаете это значение напрямую. –

ответ

1

Это должно быть ошибка с классом ProviderSignInController в Spring Social version 1.1.0.RELEASE. В классе ProviderSignInController, connectSupport создается после того, как свойства создаются:

public void afterPropertiesSet() throws Exception { 
    this.connectSupport = new ConnectSupport(sessionStrategy); 
    this.connectSupport.setUseAuthenticateUrl(true); 
}; 

Поэтому, когда метод setApplicationUrl вызывается, connectSupport еще пустой.

Теперь, когда я настраиваю его так, как показано ниже, он работает. Или, если я вернусь к версии 1.0.3.RELEASE, он отлично работает.

<bean id="providerSignInController" 
    class="org.springframework.social.connect.web.ProviderSignInController"> 
    <property name="signInUrl" value="/accounts/login" /> 
    <property name="signUpUrl" value="/accounts/signup" /> 
    <property name="postSignInUrl" value="/accounts/profile" /> 
</bean> 
<bean 
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="providerSignInController" /> 
    <property name="targetMethod" value="setApplicationUrl" /> 
    <property name="arguments"> 
     <list> 
      <bean class="java.lang.String"> 
       <constructor-arg value="${applicationUrl}" /> 
      </bean> 
     </list> 
    </property> 
</bean> 

Последующая деятельность

Эта проблема была решена в Спринг социальной версии 1.1.3.RELEASE. В классе ProviderSignInController, метод afterPropertiesSet был обновлен:

public void afterPropertiesSet() throws Exception { 
    this.connectSupport = new ConnectSupport(sessionStrategy); 
    this.connectSupport.setUseAuthenticateUrl(true); 
    if (this.applicationUrl != null) { 
     this.connectSupport.setApplicationUrl(applicationUrl); 
    } 
}; 

В результате обходная конфигурации, приведенной выше (кстати, не будет работать с Spring социальной версией 1.1.3.RELEASE любого другого) теперь может упростить до:

<bean id="providerSignInController" 
    class="org.springframework.social.connect.web.ProviderSignInController"> 
    <property name="signInUrl" value="/accounts/login" /> 
    <property name="signUpUrl" value="/accounts/signup" /> 
    <property name="postSignInUrl" value="/accounts/profile" /> 
    <property name="applicationUrl" value="${applicationUrl}" /> 
</bean> 
Смежные вопросы