Duvida com implementacao com ResquestScoped

Ola, eu lembro que ja passei por isso, mas faz tempo, acabei resolvendo usando ViewScoped. Eu tenho uma pagina que lista produtos. Ao clicar no bota, redireciono para a pagina de alteracao de preco. Se eu definir o bean como requestscoped nao ao clicar no botao, ele nao chama o metodo selecionar(). Com o viewscoped como muda a pagina eu implementei dessa forma, gostaria de saber se é a forma correta. E se alguem souber porque o escopo de resquest nao executa a action.

`

@ManagedBean
@ViewScoped
public class ProdutoController {

    private ProdutoService service = new ProdutoService();
    private Produto produto;
    private ProdutoLoja produtoLoja;
    private List<Produto> produtos;

    public ProdutoController() {
    }

    @PostConstruct
    public void init() {
        String idProduto = (String) FacesUtil.recuperarDoRequest("idProduto");
        if (idProduto != null) {
            produto = service.pesquisarPorID(new Integer(idProduto));
            produtoLoja = service.pesquisarProdutoLoja(produto);
        }
        produtos = new ArrayList<>();
    }

   public String selecionar() {        
        FacesUtil.salvarNoRequest("idProduto", produto);
        return "alteraPreco.faces";
    }
}

`

A codigo da pagina do trecho onde o produto eh selecionado
`

    <p:commandButton title="Selecionar" action="#{produtoController.selecionar()}"  icon="ui-icon-check">
            f:setPropertyActionListener value='#{produto}' target='#{produtoController.produto}'/>
    </p:commandButton>

`

Eu pesquiso os produtos, seleciono no que eu quero alterar o preco. ele direciona para a pagina, eu altero o preco, salvo e retorno para a pagina de listagem. Isso tudo esta funcionando com o ViewScoped. Se eu colocar em Resquet, ao clicar no botao selecionar nao funciona.

Quero saber se essa implementacao do bean para ir de uma pagina para outra é a mais adequada.

Faltou o codigo do commandButton.

o codigo jsf some quando colo ele aqui

@thimor É uma situação que realmente eu nunca tinha passado.
Mas pesquisando achei muito exemplos usando o :

<p:commandButton title="Selecionar" action="#{produtoController.selecionar}"  icon="ui-icon-check">
    <f:param name="produto" value="#{produto}"/>
</p:commandButton>

E do lado da Controller se coloca @ManagedProperty("#{param.produto}"). Verifica estes valores via sysout no PostConstruct.
Lendo a documentação do setPropertyActionListener não vi nenhuma abordagem sobre restrição aos scope.
Ou voçê pode tentar

<p:commandButton title="Selecionar" action="#{produtoController.selecionar(produto)}"  icon="ui-icon-check" />

E assim alterar o método selecionar p/ receber produto.

Eu uso p:dialog mesmo com ajax. E esta funcionando direito. So que eu coloquei o projeto num servidor pago. E ele ta passando da quantidade de jvm que tenho. Dai quero colocar os mb como request para ver como fica o consumo de memoria. So que quando boto em request… A selecao dos objetos das listas dao esse problema de redirecionamento. Ele nao chama o metodo.

eu a principio estava usando com o f:para, porem não estava usando o @managedproperty vou testar dessa forma.

Eu dei mais umas pesquisadas e achei um topico daqui mesmo, do Hebert, falando que bibliotecas visuais como primefaces e richfaces nao funcionam no escopo de request. E comprovei tirando os componentes do primefaces da pagina e funcionou normalmente.

1 curtida

Fala meu amigo.

Tenta implementar Serializable.

Dê uma olhada no post abaixo, sobre escopo:

Parei com JSF, já deu. kkkk

Abraço

1 curtida

Ola,

O problema eh pq o data table do primefaces so funciona em view scoped. Testei tirando os compronentes do primefaces e funcionou em request sem problemas.

Vc esta usando o que agora no lugar do jsf?

Estuda qualquer outra coisa que nao seja baseado em componente do lado servidor. Spring Boot com Spring MVC é uma boa escolha para Java. Antes disso, caso não tenha se aprofundado, é necessário aprender HTTP/REST e consequentemente front-end HTML/CSS/JS.