2012-01-15 6 views
1

Мне нужен сеансовый компонент, доступный для уровней доступа к службам и данным, но я не хочу вводить его в каждый объект.Статический класс для извлечения сессионного компонента в Spring и JSF

Я не хочу, чтобы это:

<!-- a HTTP Session-scoped bean exposed as a proxy --> 
    <bean id="userPreferences" class="com.foo.UserPreferences" scope="session"> 

      <!-- this next element effects the proxying of the surrounding bean --> 
      <aop:scoped-proxy/> 
    </bean> 

    <!-- a singleton-scoped bean injected with a proxy to the above bean --> 
    <bean id="userService" class="com.foo.SimpleUserService"> 

     <!-- a reference to the proxied 'userPreferences' bean --> 
     <property name="userPreferences" ref="userPreferences"/> 

    </bean> 

ли создать Возможное статический класс для извлечения компонента сеанса текущего запроса?

Что-то вроде этого:

<!-- a HTTP Session-scoped bean exposed as a proxy --> 
     <bean id="userPreferences" class="com.foo.UserPreferences" scope="session"> 

       <!-- this next element effects the proxying of the surrounding bean --> 
       <aop:scoped-proxy/> 
     </bean> 

Public Class sessionResolver{ 

    public static UserPreferences getUserPreferences(){ 

    //Not real code!!! 
    return (UserPreferences)WebApplicationContex.getBean("userPreferences") 
    } 

} 
+0

Я установил код-макет в getUserPreferences, потому что я думаю, что это невозможно сделать в конфигурации весны, но я предпочитаю конфигурацию вместо кода, конечно. – jlvaquero

ответ

2

Я не уверен, что это работает, и я не есть способ, чтобы попробовать это прямо сейчас, но как об этом:

public static UserPreferences getUserPreferences(){ 

    return (UserPreferences) ContextLoader.getCurrentWebapplicationContext() 
              .getBean("userPreferences"); 
} 
+0

Я попробую. Благодаря! По крайней мере, теперь я знаю, как извлекать webApplicationContext из любого кода. XD – jlvaquero

+0

@ user551263, но я думаю, что он, вероятно, не будет работать с областью запросов или сеанса. Я думаю, что эти области работают только внутри веб-контроллеров. Но стоит попробовать. –

+1

Похоже, что это работает. – jlvaquero

1

Определите вспомогательный класс как UserPrefHelper.java

public class UserPrefHelper { 
    private static com.foo.UserPreferences userPrefs; 
    private void setUserPrefs(com.foo.UserPreferences userPrefs) { 
    this.userPrefs = userPrefs; 
    } 
    private static UserPreferences getUserPrefs() { 
    return userPrefs; 
    } 
} 



<!-- a HTTP Session-scoped bean exposed as a proxy --> 
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"> 

     <!-- this next element effects the proxying of the surrounding bean --> 
     <aop:scoped-proxy/> 
</bean> 

<!-- a singleton-scoped bean injected with a proxy to the above bean --> 
<bean id="userPrefHelper" class="com.foo.UserPrefHelper"> 

    <!-- a reference to the proxied 'userPreferences' bean --> 
    <property name="userPreferences" ref="userPreferences"/> 

</bean> 

Затем использовать этот вспомогательный класс в классах непосредственно, и это все. Он превратит вас в проксированный объект UserPreferences каждый раз, и выполнение метода будет делегировано фактору сеанса.

public void test() { 
    UserPreferences userPrefs = UserPrefHelper.getUserPrefs(); 
    //That's all. Don't worry about static access and thread safety. Spring is clever enough.      
} 
Смежные вопросы