javax.el.PropertyNotFoundException: Target Unreachable, 'BracketSuffix' вернул null

Я пытаюсь вставить несколько IP-адресов в List<String>, используя простой пример. Но я получаю следующую ошибку.

javax.el.PropertyNotFoundException: Target Unreachable, 'BracketSuffix' вернул null

Вот моя страница JSF 2.2:

<h:form id="form">
    <ui:repeat value="#{exampleBean.ipAddresses}" var="s"
        varStatus="status">
        <h:inputText value="#{exampleBean.ipAddresses[status.index]}" />
    </ui:repeat>
    <h:inputText value="#{exampleBean.newIp}" />
    <h:commandButton value="Add" action="#{exampleBean.add}" />
    <h:commandButton value="Save" action="#{exampleBean.save}" />
</h:form>

А вот и мой фонарь:

@ManagedBean
@ViewScoped
public class ExampleBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private List<String> ipAddresses;
    private String newIp;

    @PostConstruct
    public void init() {
        ipAddresses= new ArrayList<String>();
    }

    public String save() {
        System.out.println(ipAddresses.toString());
        return null;
    }

    public void add() {
        ipAddresses.add(newIp);
        newIp = null;
    }

    public List<String> getIpAddresses() {
        return ipAddresses;
    }

    public String getNewIp() {
        return newIp;
    }

    public void setNewIp(String newIp) {
        this.newIp = newIp;
    }

}

Чем это вызвано и как я могу это решить?


person TusharM    schedule 16.02.2016    source источник


Ответы (1)


javax.el.PropertyNotFoundException: Target Unreachable, 'BracketSuffix' вернул null

Сообщение об исключении неверно. Это ошибка в реализации EL, используемой сервером. В вашем конкретном случае это на самом деле означало следующее:

javax.el.PropertyNotFoundException: Target Unreachable, 'ipAddresses[status.index]' вернул null

Другими словами, такого элемента в списке массивов нет. Это говорит о том, что bean-компонент был воссоздан при отправке формы и, следовательно, повторно инициализирует все по умолчанию. Таким образом, он ведет себя как @RequestScoped. Скорее всего, вы импортировали неправильную аннотацию @ViewScoped. Для @ManagedBean необходимо убедиться, что @ViewScoped импортирован из того же пакета javax.faces.bean, а не из javax.faces.view, представленного в JSF 2.2, который специально предназначен для компонентов CDI @Named.

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

Смотрите также:


Обновление: судя по комментариям, вы используете WebSphere 8.5, которая обычно поставляется с древней версией MyFaces 2.0.x. Я воспроизвел вашу проблему с MyFaces 2.0.5. Его <ui:repeat> не удалось запомнить свое состояние просмотра для статуса итерации, поэтому ваша конструкция по-прежнему дает сбой, даже если вы правильно используете bean-компонент @ViewScoped. Я мог бы обойти это, используя вместо этого <c:forEach>.

<c:forEach items="#{exampleBean.ipAddresses}" var="s" varStatus="status">
    ...
</c:forEach>

Альтернативным решением (кроме обновления MyFaces до более новой/достойной версии, очевидно) было бы обернуть неизменяемый String в изменяемый javabean, такой как

public class IpAddress implements Serializable {
    private String value;
    // ...
}

так что вы можете использовать List<IpAddress> вместо List<String> и, таким образом, вам больше не нужен varStatus, который вызвал ошибку MyFaces.

private List<IpAddress> ipAddresses;
private IpAddress newIp;

@PostConstruct
public void init() {
    ipAddresses= new ArrayList<IpAddress>();
    newIp = new IpAddress();
}

<ui:repeat value="#{exampleBean.ipAddresses}" var="ipAddress">
    <h:inputText value="#{ipAddress.value}" />
</ui:repeat>
<h:inputText value="#{exampleBean.newIp.value}" />
person BalusC    schedule 16.02.2016
comment
Спасибо за ответ ... но у меня все еще есть эта ошибка. вот мой импорт import java.io.Serializable; импортировать java.util.ArrayList; импортировать java.util.List; импортировать javax.annotation.PostConstruct; импортировать javax.faces.bean.ManagedBean; импортировать javax.faces.bean.ViewScoped; Итак... когда я открываю страницу... она показывает мне одно текстовое поле, кнопки "Добавить" и "Сохранить". Затем, когда я помещаю текст в текстовое поле и нажимаю «Добавить»… он показывает 2 текстовых поля, а текст в первом поле исчез. После этого, когда я нажимаю «Добавить/сохранить».. Я получаю сообщение об ошибке выше… Я разместил полный код .. так что вы можете скопировать и попробовать... Спасибо - person TusharM; 17.02.2016
comment
Ваш компонент реконструируется по каждому запросу. Вы можете убедиться в этом сами, поставив точку останова в @PostConstruct. Его нельзя вызывать во время запросов на отправку формы. Если это все еще происходит, несмотря на правильную аннотацию, то есть несколько причин, наиболее распространенными из которых являются: 1) дублирование библиотек JSF с разными версиями в пути к классам, 2) файлы cookie сеанса не поддерживаются. - person BalusC; 17.02.2016
comment
Я пробовал точки останова и вижу, что @PostConstruct не вызывается для каждого запроса... не знаю, в чем проблема... Можете ли вы попробовать мой код и посмотреть, сможете ли вы его воспроизвести?? - person TusharM; 17.02.2016
comment
Ваша проблема не воспроизводится на Mojarra 2.2.12 + Tomcat 8.0.32. Пробовали ли вы поставить точку останова на getIpAddresses(), чтобы проверить, возвращает ли он правильный список обратных передач? - person BalusC; 17.02.2016
comment
Какую реализацию/версию JSF и реализацию/версию сервера вы используете? - person BalusC; 18.02.2016
comment
WebSphere 8.5 объединяет MyFaces 2.0.0~2.0.5 (в зависимости от последнего патча), который довольно древний и содержит множество ошибок. Как именно вы обновили/установили на него Mojarra 2.2? - person BalusC; 18.02.2016
comment
Я перешел по этой ссылке stackoverflow.com/questions/ 13125782/ и похоже, что я использую MyFaces JSF API Расположение: CodeSource, url=file:/C:/Program Files (x86)/IBM/WebSphere/AppServer/plugins/javax.j2ee.jsf.jar, ‹ нет сертификатов › JSF Impl Location: CodeSource, url=file:/C:/Program Files (x86)/IBM/WebSphere/AppServer/plugins/com.ibm.ws.jsf.myfaces.jar, ‹нет сертификатов› Итак.. , Что я должен сделать сейчас, чтобы решить мою первоначальную проблему? - person TusharM; 18.02.2016
comment
Обычно реализация/версия JSF регистрируется в журнале запуска веб-приложения. - person BalusC; 18.02.2016
comment
Я только что попробовал MyFaces 2.0.5 и воспроизвел вашу проблему. Смотрите обновленный ответ. - person BalusC; 18.02.2016
comment
Идеально !! обновленный ответ работал как шарм .. единственное, что .. в save () я не получаю самый последний элемент ... Для одной записи я получаю [].... для второй я получаю [tushar] ... и так далее. .. я пропустил какой-либо индекс ?? - person TusharM; 18.02.2016
comment
Он все еще находится в newIp, потому что вы не нажали add(). - person BalusC; 18.02.2016