В моем приложении JSF есть управляемый компонент @ConversationScoped CDI управляемый компонент, используя Primefaces 5.2, работающий на Wildfly 8.2.1. Неявная навигация просто работает один раз в моем приложении. Во-первых, у меня есть мой index.xhtml, который имеет кнопку, которая вызывает мой управляемый компонент, CiudadManagedBean:Неявная навигация не работает
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
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:p="http://primefaces.org/ui">
<ui:composition template="/plantilla/template.xhtml">
<ui:define name="contenido">
<h:form>
<p:commandButton action="#{ciudadMB.cargarCiudades()}"
value="Mostrar ciudades" />
</h:form>
</ui:define>
</ui:composition>
</html>
Далее, здесь CiudadesManagedBean. Как вы можете видеть, я начать разговор о методе @PostConstruct и загружает список, когда я называю cargarCiudades из index.xhtml, и, наконец, он загружает ciudades/lista.xhtml:
package com.saplic.fut.beans;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import com.saplic.fut.daos.CiudadDAO;
import com.saplic.fut.entity.Ciudad;
@Named(value="ciudadMB")
@ConversationScoped
public class CiudadManagedBean implements Serializable {
private static final long serialVersionUID = 7339176875158769385L;
private Ciudad instance;
private List<Ciudad> cities;
private Integer idCity;
@Inject
private CiudadDAO ciudadDAO;
@Inject
private Conversation conversation;
@PostConstruct
public void inicializarConversacion() {
if(conversation.isTransient())
conversation.begin();
}
public Ciudad getInstance() {
return instance;
}
public String cargarCiudades() {
setCities(ciudadDAO.cargarCiudades());
return "ciudades/lista";
}
public String cargar() {
Ciudad flt = new Ciudad();
flt.setId(getIdCity());
setInstance(ciudadDAO.cargarDetalle(flt));
if(getInstance() == null)
setInstance(new Ciudad());
return "ciudades/detalle";
}
public String guardar() {
ciudadDAO.guardar(getInstance());
setCities(ciudadDAO.cargarCiudades());
return "ciudades/lista";
}
public String actualizar() {
ciudadDAO.actualizar(getInstance());
setCities(ciudadDAO.cargarCiudades());
return "ciudades/lista";
}
public String eliminar() {
ciudadDAO.guardar(getInstance());
setCities(ciudadDAO.cargarCiudades());
return "ciudades/lista";
}
public void setInstance(Ciudad instance) {
this.instance = instance;
}
public List<Ciudad> getCities() {
return cities;
}
public void setCities(List<Ciudad> cities) {
this.cities = cities;
}
public Integer getIdCity() {
return idCity;
}
public void setIdCity(Integer idCity) {
this.idCity = idCity;
}
}
Наконец, в XHTML, где я вызовите мой метод cargar(). Я хочу вызвать этот метод, а затем загрузить ciudades/detalle.xhtml, потому что вот моя форма.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
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:p="http://primefaces.org/ui">
<ui:composition template="/plantilla/template.xhtml">
<ui:define name="contenido">
<h:form id="frm1">
<p:dataTable id="tablita" resizableColumns="true" rowIndexVar="rowIdx"
paginator="true" rows="10" paginatorPosition="bottom" value="#{ciudadMB.cities}"
var="ciu" >
<p:column headerText="Código pais">
<p:outputLabel value="#{ciu.codigoPais}" />
</p:column>
<p:column headerText="Distrito">
<p:outputLabel value="#{ciu.distrito}" />
</p:column>
<p:column headerText="Nombre">
<p:outputLabel value="#{ciu.nombre}" />
</p:column>
<p:column headerText="Población">
<p:outputLabel value="#{ciu.poblacion}" />
</p:column>
<p:column headerText="Accion">
<p:commandLink action="#{ciudadMB.cargar()}" ajax="false" value="Ver" process="@form">
<f:setPropertyActionListener value="#{ciu.id}" target="#{ciudadMB.idCity}" />
</p:commandLink>
</p:column>
</p:dataTable>
</h:form>
</ui:define>
</ui:composition>
</html>
Когда я нажимаю на ссылку внутри моей DataTable, он вызывает ciudadMB.cargar() и выполняет код внутри него, но он игнорирует возвращение «ciudades/detalle». Таким образом, неявная навигация работает в первый раз (когда я нахожусь в index.xhtml, и я нажимаю кнопки, она принимает меня в lista.xhtml), но когда я нажимаю ссылку, чтобы перейти в detalle.xhtml, она игнорирует ее. Он просто обновляет lista.xhtml. Кроме того, я попытался с @SessionScoped и @RequestScoped (всегда используя аннотации javax.enterprise.context вместо аннотаций JSF и удаление объекта беседы и инициализации).
С @SessionScoped он имеет такое же поведение. Pagination работает без проблем, но когда я нажимаю на commandLink внутри datatable, он вызывает метод действия, но игнорирует возврат строки.
С помощью @RequestScoped, если я нажму кнопку commandLink, он обновит страницу, но не вызывает метод действия. Если я помещаю фиктивный commandLink за пределы datatable, он вызывает метод действия, но опять же, он игнорирует возврат строки.
Почему неявная навигация не работает? Есть ли проблема с CDI? С уважением.
EDIT: Я также изменил аннотации на import javax.faces.bean.ManagedBean; импорт javax.faces.bean.SessionScoped; , чтобы проверить, было ли это об аннотации CDI, но это тоже не сработало, поэтому это не проблема CDI. Нужно ли мне активировать что-то в моей конфигурации, чтобы заставить его работать? Это Eclipse Dynamic Web Project 3.1, JPA 2.1 и JSF 2.2, работающие на Wildfly 8.2.1. Вот мой конфигурационный файл web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>SistemaFutJsf</display-name>
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/</url-pattern>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>cupertino</param-value>
</context-param>
</web-app>
лица-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
</faces-config>
И КДИ beans.xml файл:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="annotated">
</beans>
Вы намекаете, что она отлично работает с JSF управляемого компонента. Но вы никоим образом не подтвердили это в своем вопросе. Просьба уточнить. Кроме того, ваш bean-компонент на самом деле является областью сеанса, а не чатом. Это смущает. – BalusC
Извините, вы правы. Я перешел на @ SessionScoped, чтобы проверить, была ли это проблемой, специфичной для @ ConversationScopes, но она тоже не работала. Я исправлю свой вопрос. –
ОК, подведя итог, независимо от структуры управления компонентом, и независимо от области компонента, метод действия в любом случае правильно вызван, но возвращаемая строка для результата навигации полностью игнорируется, так как в этом случае она возвращается на ту же страницу? – BalusC