0

Spring bean with session scope

asked 2010-10-07 19:25:16 +0800

phelen gravatar image phelen
33 1 1

updated 2010-10-07 19:26:12 +0800

Hello! I have a Controller with Scope="session" with a zul...
<?page title="Cadastrar Agenda" contentType="text/html;charset=UTF-8"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="main"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver" ?>
<zk>
    <window id="configurar" border="none" apply="${configuracao}"
        height="100%" width="100%">
     .....
.....
   </window>
</zk>

package br.com.romulo.agenda.controllers;

import java.util.List;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.ForwardEvent;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zkplus.spring.SpringUtil;
import org.zkoss.zul.Div;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Tab;
import org.zkoss.zul.West;

import br.com.romulo.agenda.bean.DadosSistemaBean;
import br.com.romulo.agenda.model.UsuarioAgenda;
import br.com.romulo.agenda.service.UsuarioAgendaManager;

@Controller("configuracao")
@Scope("session")
public class Configuracao extends GenericForwardComposer{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 897352560076336323L;
	public static final int GERAL = 0;
	public static final int AGENDAS = 1;
	
	ListModelList menuModel1 = new ListModelList();
	List<UsuarioAgenda> lua;
	Listbox box;
	MenuNodeSelectListener listener1 = new MenuNodeSelectListener();
	MenuNodeItemRenderer renderer1 = new MenuNodeItemRenderer();
	Div contentDiv;
	West bWest;
	UsuarioAgendaManager usuarioAgendaManager;
	DadosSistemaBean DadosSistemaBean;
	
	Tab geral;
	Tab agendas;
	
	private int aba;	
	
	public Configuracao(){
	}	
	
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);			
		popularUsuarioAgenda();
		box.setItemRenderer(renderer1);
		box.addEventListener(Events.ON_SELECT,listener1);	
		
		agendas.setLabel("asd");
		
		switch (aba) {
			case AGENDAS:
				agendas.setSelected(true);
				break;
	
			default:
				geral.setSelected(true);
				break;
		}
		
	}
	
	public void popularUsuarioAgenda() {		
		menuModel1.clear();
		List<UsuarioAgenda> lUsuarioAgenda = usuarioAgendaManager.consultar();
		lua = lUsuarioAgenda;
		for (UsuarioAgenda usuarioAgenda : lUsuarioAgenda) {
			menuModel1.add(new MenuNode(usuarioAgenda,"cadastrarAgenda.zul"));
		}
		box.setModel(menuModel1);
	}

	class MenuNode {
		UsuarioAgenda usuarioAgenda;
		String link;
		public MenuNode(UsuarioAgenda usuarioAgenda,String link){
			this.usuarioAgenda = usuarioAgenda;
			this.link = link;
		}
		public UsuarioAgenda getUsuarioAgenda() {
			return usuarioAgenda;
		}
		public void setLabel(UsuarioAgenda usuarioAgenda) {
			this.usuarioAgenda = usuarioAgenda;
		}
		public String getLink() {
			return link;
		}
		public void setLink(String link) {
			this.link = link;
		}
	}
	
	class MenuNodeItemRenderer implements ListitemRenderer{

		public void render(Listitem item, Object data) throws Exception {
			MenuNode node = (MenuNode)data;
			item.setImage("icon-24x24.png");
			item.setLabel(node.getUsuarioAgenda().getNome());			
			item.setValue(node);
		}
	}
	
	class MenuNodeSelectListener implements EventListener{
		public void onEvent(Event event) throws Exception {
			Listitem item = box.getSelectedItem();
			contentDiv.getChildren().clear();
			if(item!=null){
				CadastrarAgenda ca = (CadastrarAgenda) SpringUtil.getBean("cadastrarAgenda");				
				
				MenuNode node = (MenuNode)item.getValue();
				ca.setUsuarioAgenda(usuarioAgendaManager.getById(node.getUsuarioAgenda().getId()));
				Executions.createComponents(node.getLink(),contentDiv,null);
			}
		}		
	}
	
	public void onClick$voltarAgendaTopo(ForwardEvent event) {
		voltarAgenda();
	}
	
	public void onClick$voltarAgendaRodape(ForwardEvent event) {
		voltarAgenda();
	}
	
	public void voltarAgenda() {
		contentDiv.getChildren().clear();
		Executions.createComponents("calendar.zul",contentDiv,null);
		bWest.setVisible(true);
	}
	
	public void onClick$adicionarAgenda(ForwardEvent event) {
		contentDiv.getChildren().clear();
		CadastrarAgenda ca = (CadastrarAgenda) SpringUtil.getBean("cadastrarAgenda");
		DadosSistemaBean db = (DadosSistemaBean) SpringUtil.getBean("DadosSistemaBean");
		UsuarioAgenda usuarioAgenda = new UsuarioAgenda();
		usuarioAgenda.setIdUsuario(db.getUsuarioLogado().getId());
		ca.setUsuarioAgenda(usuarioAgenda);
		ca.setOrigem("configuracao");
		Executions.createComponents("cadastrarAgenda.zul",contentDiv,null);		
	}

	public int getAba() {
		return aba;
	}


	public void setAba(int aba) {
		this.aba = aba;
	}

	public List<UsuarioAgenda> getLua() {
		return lua;
	}

	public void setLua(List<UsuarioAgenda> lua) {
		this.lua = lua;
	}
}

And to load the content in the center of the border layout i use:
public void onClick$configuracoes(ForwardEvent event) {
        bWest.setVisible(false);
        contentDiv.getChildren().clear();
        Configuracao co = (Configuracao) SpringUtil.getBean("configuracao");
        co.setAba(Configuracao.AGENDAS);
        Executions.createComponents("configuracao.zul",contentDiv,null);
        
    }
and I pass the tab position. But at the second time that i load the "configuracao.zul" the components stop to work. I can't use the tab.setSelected(); and the listBox stop to work two...
delete flag offensive retag edit

11 Replies

Sort by » oldest newest

answered 2010-10-08 12:45:18 +0800

terrytornado gravatar image terrytornado flag of Germany
9393 3 7 16
http://www.oxitec.de/

Make a test with scope="prototype"

link publish delete flag offensive edit

answered 2010-10-08 13:10:50 +0800

phelen gravatar image phelen
33 1 1

Hello Terry. With prototype Works fine, but i can't pass parameters with

Configuracao co = (Configuracao) SpringUtil.getBean("configuracao");
co.setAba(Configuracao.AGENDAS);

How can I pass parameters to a prototype bean? When I work with jsf i use session and pass parameters before load the page with getBean.
Thanks.

link publish delete flag offensive edit

answered 2010-10-09 17:45:24 +0800

terrytornado gravatar image terrytornado flag of Germany
9393 3 7 16
http://www.oxitec.de/

updated 2010-10-09 17:45:49 +0800

Try


1.

public void onClick$configuracoes(ForwardEvent event) {
       . . .
	HashMap<String, Object> map = new HashMap<String, Object>();
	map.put("aba", "AGENDAS");

        Executions.createComponents("configuracao.zul",contentDiv, map);


2. You must correct the aba type

	@Override
	public void doAfterCompose(Component window) throws Exception {
		super.doAfterCompose(window);
    . . .

		if (this.arg.containsKey("aba")) {
			setAba(String) this.arg.get("aba"));


     . . .

	popularUsuarioAgenda();
		box.setItemRenderer(renderer1);
		box.addEventListener(Events.ON_SELECT,listener1);	
		
		agendas.setLabel("asd");
		
		switch (aba) {
			case AGENDAS:
				agendas.setSelected(true);
				break;
	
			default:
				geral.setSelected(true);
				break;
		}

link publish delete flag offensive edit

answered 2010-10-10 15:58:03 +0800

phelen gravatar image phelen
33 1 1

Thanks Terry! It works fine!

link publish delete flag offensive edit

answered 2010-10-12 21:49:28 +0800

phelen gravatar image phelen
33 1 1

updated 2010-10-12 22:07:38 +0800

Now with scope("prototype") all logged user are using de same bean.

i had BorderLayoutComposer as the main layout, with a border layout

package br.com.romulo.agenda.controllers;

@Controller("borderLayoutComposer")
@Scope("prototype")
public class BorderLayoutComposer extends GenericForwardComposer{
	
	/**
	 * 
	 */
	DadosSistemaBean DadosSistemaBean;	
}

And DadosSistemaBean:

package br.com.romulo.agenda.bean;

import br.com.romulo.agenda.model.Usuario;

@Bean(name = "DadosSistemaBean")
@Scope("session")
public class DadosSistemaBean {
	
	private Usuario usuarioLogado;

	public DadosSistemaBean() {
	}
	
	public Usuario getUsuarioLogado() {
		return usuarioLogado;
	}
	
	public void setUsuarioLogado(Usuario usuarioLogado) {
		this.usuarioLogado = usuarioLogado;
	}
	
}

This bean work as a storege to user keeping the logged user or the calendar he seeing. I need it because if I have two users logged, probably they are seeing diferent things.

So, after I change the "BorderLayoutComposer" to @Session("prototype") all the logged user are using the same "DadosSistemaBean". How can i resolve it?

link publish delete flag offensive edit

answered 2010-10-13 04:07:24 +0800

ashishd gravatar image ashishd flag of Taiwan
1972 6

Hi phelen,
Strange. That seems very unlikely. Did you try printing DadosSistemaBean object hashcode to make sure they are the same?

link publish delete flag offensive edit

answered 2010-10-13 04:36:00 +0800

terrytornado gravatar image terrytornado flag of Germany
9393 3 7 16
http://www.oxitec.de/

Hmmmmmmmmm, scope=prototype

from the spring doc:

3.4.2. The prototype scope
The non-singleton, prototype scope of bean deployment results in the creation of a new bean instance every time a request for that specific bean is made ...

Spring-documentation, Chapüter 3.4 Bean scopes.

If you would have that users have different 'views' or components that they belong to, than it's a kind of the view/security logic and not the scope of a bean.

Stephan

link publish delete flag offensive edit

answered 2010-10-13 19:54:54 +0800

phelen gravatar image phelen
33 1 1

ashishd, Yes, they have tehe same hashcode.

Terry, can be a problem with spring security. Because if I log in in Firefox, when I acess by I.E. the system don't ask me log in.

My spring security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
	<http auto-config="false" entry-point-ref="authenticationProcessingFilterEntryPoint" access-denied-page="/negado.jsp">

		<logout logout-success-url="/login.zul" />

		<intercept-url pattern="/admin/**" access="ROLE_ADMIN" />

		<!-- All other resources to require users to have user role USER_ROLE to 
			view -->
		<intercept-url pattern="/*.zul" access="ROLE_ADMIN,ROLE_USER" />

		<!-- Don't apply any filters to the login form either, we want unauthenticated 
			users to be able to see this -->
		<intercept-url pattern="/login.zul" filters="none" />
		<!-- CUSTOM FILTERS -->
		<custom-filter ref="languageProcessingFilter" after="FORM_LOGIN_FILTER"/>
	</http>
	
	<authentication-manager alias="authenticationManager">
		<authentication-provider user-service-ref="userDetailServiceImpl"/>
	</authentication-manager>
	
	<beans:bean id="authenticationFailureHandler" class="br.com.romulo.agenda.springSecurityCustomFilters.AuthenticationFailHandler"/>
	
	<beans:bean id="languageProcessingFilter" class="br.com.romulo.agenda.springSecurityCustomFilters.MyAuthenticationProcessingFilter">
		<beans:property name="authenticationManager" ref="authenticationManager"/>
		<beans:property name="authenticationFailureHandler" ref="authenticationFailureHandler"/>
	</beans:bean>
	
	<beans:bean id="authenticationProcessingFilterEntryPoint" class="org.springframework.security.web.authentication.AuthenticationProcessingFilterEntryPoint">
		<beans:property name="loginFormUrl" value="/login.zul"/>
	</beans:bean>

</beans:beans>

MyAuthenticationProcessingFilter.java

package br.com.romulo.agenda.springSecurityCustomFilters;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import br.com.romulo.agenda.bean.DadosSistemaBean;
import br.com.romulo.agenda.service.UsuarioManager;
import br.com.romulo.agenda.spring.SpringBeanFactoryUtil;

public class MyAuthenticationProcessingFilter extends
		UsernamePasswordAuthenticationFilter {
	
	DadosSistemaBean dSB;
	UsuarioManager usuarioManager;

	@Override
	protected void successfulAuthentication(HttpServletRequest request,
			HttpServletResponse response, Authentication authResult)
			throws IOException, ServletException {
		HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper((HttpServletRequest) request) {
			@Override
			public String getParameter(String parameter) {
				if (parameter.equals("spring-security-redirect")) {
					return "/agenda/principal.zul";
				}
				return null;
			}
		};
		super.successfulAuthentication(wrapper, response, authResult);

		dSB = (DadosSistemaBean) SpringBeanFactoryUtil
				.getBean("DadosSistemaBean");
		
		usuarioManager = (UsuarioManager) SpringBeanFactoryUtil
		.getBean("usuarioManager");

		dSB.setUsuarioLogado(usuarioManager.consultarPorLogin(authResult.getName()));

		System.out.println("==successful login==");
	}

	/**@Override
	protected void setDetails(HttpServletRequest request,
			UsernamePasswordAuthenticationToken authRequest) {
		super.setDetails(request, authRequest);
		// String selectedLanguage = request.getParameter("request_locale");
	}*/

}

UserDetailServiceImpl.java

package br.com.romulo.agenda.springSecurityCustomFilters;

import java.util.ArrayList;
import java.util.Collection;

import net.sourceforge.sannotations.annotation.Bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

import br.com.romulo.agenda.model.Usuario;
import br.com.romulo.agenda.service.UsuarioManager;
import br.com.romulo.agenda.utils.StringUtils;

@Bean(name = "userDetailServiceImpl")
public class UserDetailServiceImpl implements UserDetailsService {
	@Autowired
	private UsuarioManager usuarioManager;

	@Override
	public UserDetails loadUserByUsername(String username)
			throws UsernameNotFoundException, DataAccessException {
		if (!StringUtils.isEmptyOrNull(username)) {

			final Usuario usuario = usuarioManager.consultarPorLogin(username);

			if (usuario != null) {

				final User user;

				Collection<GrantedAuthority> nivel = new ArrayList<GrantedAuthority>();
				GrantedAuthorityImpl teste = new GrantedAuthorityImpl(
						usuario.getNivelAcesso());
				nivel.add(teste);

				user = new User(usuario.getLogin(), usuario.getSenha(), true,
						true, true, true, nivel);

				if (user != null) {
					return user;

				}
			}
		}

		return null;
	}
}

link publish delete flag offensive edit

answered 2010-10-13 20:48:06 +0800

phelen gravatar image phelen
33 1 1

DEBUG (AbstractBeanFactory.java:242) - Returning cached instance of singleton bean 'dadosSistemaBean'
DEBUG (AbstractBeanFactory.java:242) - Returning cached instance of singleton bean 'dadosSistemaBean'

But the the scope is session

@Bean(name = "dadosSistemaBean")
@Scope("session")
public class DadosSistemaBean {
}

link publish delete flag offensive edit

answered 2010-10-14 02:42:37 +0800

terrytornado gravatar image terrytornado flag of Germany
9393 3 7 16
http://www.oxitec.de/

updated 2010-10-14 02:42:59 +0800

Hmmmm, maybe it have to do with the bean dependencies.

link

@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)

link publish delete flag offensive edit
Your reply
Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

[hide preview]

Question tools

Follow

RSS

Stats

Asked: 2010-10-07 19:25:16 +0800

Seen: 2,639 times

Last updated: Oct 14 '10

Support Options
  • Email Support
  • Training
  • Consulting
  • Outsourcing
Learn More