Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Obrigatório usar http://localhost:8080/livraria/autor.xhtml?autorId='AlgumId'

Após usar a viewAction toda vez que eu quiser acessar meu projeto pela url vou ter que usar o sufixo ?autorId= ? Porque quando tento acessar sem passar o id da um erro dizendo que um id é necessário.

4 respostas

Fala Eduardo, tudo bem ?

Então .. o id que você passa precisa ser usado justamente pra conseguir acessar as informações do seu autor. Pra consegui trazer os dados pra sua página o id é necessário. Mas não necessariamente você precisa disso pra todo o projeto. Pode ter outras páginas que são acessadas e que não precisem que você envie qualquer dado, como um id.

Esperto ter ajudado. Abraço!

E ai Rafael, A questão é, toda vez que vou acessar a página autor.xhtml devo passar um id no url, caso contrário é lançado essa exceção. Fiz o seguinte, retirei do xhtml a viewAction pra poder acessar a página sem passar qualquer parâmetro. Porém não queria ter que fazer isso toda vez que acessar a página. Abs.

Fala Eduardo, tudo bem ?

Bom, não muito jeito mesmo. A viewAction é usada em geral pra justamente pra rodar alguma checagem de algo que vem da view. Como demonstrado no exemplo nesse doc: http://www.oracle.com/technetwork/articles/java/jsf22-1377252.html ...

<f:metadata>
    <f:viewParam id="id" name="item" value="#{catalog.item}"/>
    <f:viewAction action="#{catalog.checkItem}"/>
</f:metadata>

Note: The viewAction component must be declared as a child of a metadata facet. This allows the view action to be part of the JavaServer Faces lifecycle for both non-faces and faces requests. If you put it anywhere else in the page, the behavior is undefined.

Notice that the view action calls a validation method (checkItem) of the bean, eliminating the need for a Validator class ...:

@Named
@RequestScoped
public class Catalog implements Serializable {

    private Integer item;
    private FacesContext facesContext;
    @Inject private ValidItemRange range; // An ApplicationScoped Bean
                                // the declares a high and low int
    @PostConstruct
    public void postConstruct() {
        facesContext = FacesContext.getCurrentInstance();
    }

    public String checkItem() {
        if (item.intValue() >= range.getLow() && 
            item.intValue() <= range.getHigh()) {
            return null;
        }
        facesContext.addMessage(null, 
            new FacesMessage("The item number you entered is invalid."));
        return "index";
    }

    // ... other getter and setter methods
}

O que você pode fazer é tentar planejar uma lógica suplementar pra evitar a exception, mas se realmente você não deseja que sempre lhe seja forçada a passagem do parâmetro, creio que não usar o recurso.

Abraço!

solução!

E ai Rafael, tudo ótimo. O problema já foi resolvido, era o if na viewAction.

<f:viewAction action="#{autorBean.carregarAutorPeloId}"
            if="#{param['autorId'] != null}" />

Meu if estava diferente.