[RESOLVIDO] Salvar parâmetros da URL em atributos de um componente do Seam

3 respostas
rafael.espiritosanto

Olá!

A minha aplicação é iniciada através de um url do tipo
http://localhost:8080/configuradorrs/home.seam?idActor=ues&idProject=2
Eu preciso salvar esses parâmetros em um componente, para que possa ter acesso a essas informações posteriormente. Fiz da seguinte maneira
@Name("homeAction")
@Scope(ScopeType.CONVERSATION)
public class HomeAction implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -4694237049008052171L;

	@In
	private Actor actor;
	
	@In
	private StatusMessages statusMessages;
	
	@In(create=true)
	private JbpmContext jbpmContext;
	
	@RequestParameter
	private String idActor;
	
	@RequestParameter
	private String idProject;
	
	public String getIdActor() {
		return idActor;
	}

	public void setIdActor(String id) {
		this.idActor = id;
	}

	public String getIdProject() {
		return idProject;
	}

	public void setIdProject(String idProject) {
		this.idProject = idProject;
	}

	public boolean isAvaliableToProceed() {
		//return (idActor != null && idProject != null);
		return true;
	}
	
	public void initializeParams() {
		if (idActor != null && idProject != null) {
			actor.setId(idActor);
			actor.getGroupActorIds().add("researcher");
		} else {
			statusMessages.addFromResourceBundle("initialpage.paramsnotfound.message");
		}
	}
	
	@Transactional
	public String begin() {
		GraphSession gs = jbpmContext.getGraphSession();
		ProcessDefinition def = gs.findLatestProcessDefinition("buildProtocol");
		
		String processInstanceKey = "pik_" + idProject;
		
		ProcessInstance pi = jbpmContext.getProcessInstance(def, processInstanceKey);
		if (pi == null) {
			pi = new ProcessInstance(def, null);
			pi.setKey(processInstanceKey);
			Token tkn = pi.getRootToken();
			tkn.signal();
		} else {
			//TODO: Query for Pooled Task List associated with this Process Instance
			pi.resume();
		}
		return "/listActivities.xhtml";
	}
}
Para poder fazer tal atribuição dos parâmetros ao componente, declarei o seguinte trecho no arquivo pages.xml
<page view-id="/home.xhtml">
		<action execute="#{homeAction.initializeParams}"/>
		<param name="idActor" value="#{homeAction.idActor}"/>
		<param name="idProject" value="#{homeAction.idProject}"/>
	</page>

Por fim, a página xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:s="http://jboss.com/products/seam/taglib"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:rich="http://richfaces.org/rich"
    template="layout/template.xhtml">

    <ui:define name="body">
		<div align="center">
        <h1>#{messages['initialpage.welcome.message']}</h1>
        <rich:panel>
            <h:panelGrid columns="3">
                <h:graphicImage value="/img/logopesc.gif" alt="PESC logo"/>
                <s:div styleClass="info">
                    <p>
                    	<strong>#{messages['initialpage.main.message']}</strong><br />
                    	<strong>#{messages['initialpage.start.message']}</strong>
                    </p>
                    
                </s:div>
                <h:graphicImage value="/img/esegroup_logo.png" alt="PESC logo"/>
            </h:panelGrid>
        </rich:panel>
        </div>
		<div align="center">
			<h:form>
				<h:commandButton value="#{messages['button.start']}" action="#{homeAction.begin}" disabled="#{!homeAction.avaliableToProceed}">
					<s:conversationPropagation type="join"/>
				</h:commandButton>
			</h:form>
		</div>
    </ui:define>
</ui:composition>
No entanto, dentro do próprio método begin eu já não tenho acesso ao valor dos parâmetros. Eu coloquei o componente com o escopo CONVERSATION porque desejo ter acesso aos dados durante a navegação na aplicação (estou usando JBPM). O que estou fazendo de errado e como posso resolver o problema? Obrigado!

3 Respostas

rafael.espiritosanto

O que eu reparei é que no método initializeParams (executado assim que a página é exibida), os parâmetros são armazenados no componente corretamente. No entanto, ao clicar no botão que redireciona pra próxima página, os valores se perdem. Eu pensei que poderia ser pelo fato de não ter iniciado uma conversação. Então eu coloquei a annotation no método initializeParams

@Begin(join=true) public void initializeParams() { if (idActor != null && idProject != null) { actor.setId(idActor); actor.getGroupActorIds().add("researcher"); } else { statusMessages.addFromResourceBundle("initialpage.paramsnotfound.message"); } }
E propago a conversação quando no trecho

<h:commandButton value="#{messages['button.start']}" action="#{homeAction.begin}" disabled="#{!homeAction.avaliableToProceed}"> <s:conversationPropagation type="join"/> </h:commandButton>

No entanto, o problema persiste.

raphaufrj

Fala espirito, blz?

Acho que vc trocou algumas bolas:

  1. Usar @RequestParameter, ou usar no pages.xml produzem o mesmo resultado. Uso ou um ou outro.
  2. Vc precisa iniciar o conversation em algum lugar. Eu costumo fazer no pages tb, como primeiro coisa,

Testa e me fala.

rafael.espiritosanto

Fiz como você comentou e funcionou! \o/
Preferi usar no pages.xml

Valeu!!

Criado 31 de agosto de 2010
Ultima resposta 2 de set. de 2010
Respostas 3
Participantes 2