Сбой доступа к бину JSF
У меня странная проблема. Я использую JSF 2.1.7 (последний вариант) в своем веб-приложении, и у меня есть компонент, которым JSF должен управлять за сеанс. Это мой код бина:
public abstract class NavegableManager<E> implements INavegableManager<E> {
/**
*
*/
private static final long serialVersionUID = 1L;
// Propiedad que controla la habilitación-desabilitación de los botones de navegación
private boolean _DisableNavigationButtons;
/**
*
*/
private final Stack<INavegable<E>> _NavegableStack;
/**
* Constructor
*/
public NavegableManager() {
super();
this._NavegableStack = new Stack<INavegable<E>>();
}
/**
* Limpia los navegables almacenados en el manager y se quita de la sesión
*
* @throws Throwable
*/
public void clear() throws Throwable {
while (!this._NavegableStack.isEmpty()) {
INavegable<E> nav = this._NavegableStack.pop();
nav.clear();
}
}
/*
* (non-Javadoc)
*
* @see
* com.tesicnor.navigator.event.INavegableListener#eventNewNavegable(com.tesicnor.navigator.event.NavegableEvent)
*/
@Override
public void eventNewNavegable(NavegableEvent event) throws NavegableServiceException {
if (event.getNavegable() != null) {
// Se asigna al navegable el mismo servicio que el navegable anterior
event.getNavegable().set_Service(this._NavegableStack.peek().get_Service());
this.push(event.getNavegable());
}
}
/*
* (non-Javadoc)
*
* @see
* com.tesicnor.navigator.event.INavegableListener#eventRemoveNavegable(com.tesicnor.navigator.event.NavegableEvent)
*/
@Override
public void eventRemoveNavegable(NavegableEvent event) {
if (this._NavegableStack.contains(event.getSource())) {
boolean mustUnFreezePeek = event.getSource() == this._NavegableStack.peek();
this._NavegableStack.remove(event.getSource());
event.getSource().unRegister(this);
event.getSource().clear();
if (mustUnFreezePeek && !this._NavegableStack.isEmpty())
this._NavegableStack.peek().unFreeze();
}
}
/*
* (non-Javadoc)
*
* @see
* com.tesicnor.navigator.event.INavegableListener#eventSelectNavegable(com.tesicnor.navigator.event.NavegableEvent)
*/
@Override
public void eventSelectNavegable(NavegableEvent event) throws NavegableServiceException {
while (!this._NavegableStack.isEmpty() && !this._NavegableStack.peek().equals(event.getSource()))
this.pop();
if (this._NavegableStack.isEmpty())
this.push(event.getSource());
this.get_Navegable().unFreeze();
}
@Override
public synchronized INavegable<E> get_Navegable() {
if (!this._NavegableStack.isEmpty())
return this._NavegableStack.peek();
else
return null;
}
@Override
public List<INavegable<E>> get_Navegables() {
return this._NavegableStack.subList(0, this._NavegableStack.size() - 1);
}
public boolean is_DisableNavigationButtons() {
return this._DisableNavigationButtons;
}
/**
*
* @return
*/
public boolean is_init() {
return true;
}
/**
* Indica si debe mostrarse el menu de navegacion. Solo se muestra si hay más de 1 elemento de navegacion
*
* @return
*/
public boolean is_ShowNavegacion() {
return this._NavegableStack.size() > 1;
}
/*
* (non-Javadoc)
*
* @see com.tesicnor.navigator.INavegableManager#isInit()
*/
@Override
public boolean isInit() {
return false;
}
/**
*
* @throws EmptyStackException
*/
private synchronized void pop() throws EmptyStackException {
INavegable<E> peek = this._NavegableStack.pop();
peek.unRegister(this);
peek.clear();
}
/*
* (non-Javadoc)
*
* @see com.tesicnor.navigator.INavegableManager#push(com.tesicnor.navigator.INavegable)
*/
private synchronized void push(INavegable<E> navegable) throws NavegableServiceException {
INavegable<E> peek = this.get_Navegable();
navegable.register(this);
this._NavegableStack.push(navegable);
if (peek != null)
peek.freeze();
}
/**
* Propiedad que controla la habilitación-desabilitación de los botones de navegación
*
* @param _disableNavigationButtons
*/
public void set_DisableNavigationButtons(boolean _disableNavigationButtons) {
this._DisableNavigationButtons = _disableNavigationButtons;
}
/*
* (non-Javadoc)
*
* @see com.tesicnor.navigator.INavegableManager#setNavegable(com.tesicnor.navigator.INavegable)
*/
@Override
public void setNavegable(INavegable<E> navegable) throws NavegableServiceException {
while (!this._NavegableStack.isEmpty())
this.pop();
this.push(navegable);
}
}
Я делаю итерацию на странице xhtml с помощью тега ui:repeat, и вот тут происходит странное. Как вы можете видеть, мои геттеры определены с undescore перед именем переменной. Мой xhtml показывает так:
<h:form>
<!-- <p:queue requestDelay="1" ignoreDupResponce="true" /> -->
<h:panelGroup id="navigationPanel">
<!-- Comprobar si está activada la deshabilitación de los botones de navegación -->
<h:panelGroup
rendered="#{!navigationManager._DisableNavigationButtons}">
<ui:repeat value="#{navigationManager._Navegables}" var="item">
<p:commandButton value="#{item._Title}"
action="#{item.actionSelected}" update="#{reRenderOnSelect}" />
</ui:repeat>
<p:commandButton disabled="true"
value="#{navigationManager._Navegable._Title}" />
</h:panelGroup>
<h:panelGroup
rendered="#{navigationManager._DisableNavigationButtons}">
<ui:repeat value="#{navigationManager._Navegables}" var="item">
<p:commandButton value="#{item._Title}"
listener="#{item.actionSelected}" update="#{reRenderOnSelect}"
disabled="true" />-->
</ui:repeat>
<p:commandButton disabled="true"
value="#{navigationManager._Navegable._Title}" />
</h:panelGroup>
</h:panelGroup>
</h:form>
Если я использую данный код, он работает без проблем, но если я преломляю get_Navegabes и изменяю имя метода на getNavegables без подчеркивания и делаю то же самое на странице xhtml, это дает мне следующую ошибку:
/system/navigation/navigation.xhtml @17,67 value="#{navigationManager.Navegables}": Property 'Navegables' not found on type com.tesicnor.system.view.navigation.NavigationManagerSystem
Таким образом, JSF не может найти недвижимость. Это происходит с каждым получателем, который я использую на этой странице, не знаю почему. Кто-нибудь экспериментировал с подобной проблемой??
1 ответ
Значение ="#{navigationManager.Navegables}" неверно, "N" не должно быть в верхнем регистре, вместо этого используйте это: value="#{navigationManager.navegables}"