У FacesConverters должны быть совместимы с равными? [Дубликат]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
65
задан BalusC 16 May 2015 в 22:10
поделиться

4 ответа

Сбой проверки с сообщением «form: location: Ошибка проверки: значение недопустимо»

Эта ошибка сводится к тому, что выбранная элемент не соответствует ни одному из доступных значений элемента выбора, указанного любым вложенным тегом <f:selectItem(s)> во время обработки запроса на отправку формы.

Как часть защиты от подделанных / взломанных запросов, JSF будет повторять все доступные выберите значения элемента и проверьте, если selectedItem.equals(availableItem) возвращает true для хотя бы одного доступного значения элемента. Если значение одного элемента не совпадает, вы получите именно эту ошибку проверки.

Этот процесс находится под обложками в основном так, как показано ниже, в соответствии с тем, что bean.getAvailableItems() представляет собой полный список доступных элементов выбора, определенных в <f:selectItem(s)>:

String submittedValue = request.getParameter(component.getClientId());
Converter converter = component.getConverter();
Object selectedItem = (converter != null) ? converter.getAsObject(context, component, submittedValue) : submittedValue;

boolean valid = false;

for (Object availableItem : bean.getAvailableItems()) {
    if (selectedItem.equals(availableItem)) {
        valid = true;
        break;
    }
}

if (!valid) {
    throw new ValidatorException("Validation Error: Value is not valid");
}

Итак, на основе по логике выше эта проблема может логически иметь по крайней мере следующие причины:

  1. Выбранный элемент отсутствует в списке доступных элементов.
  2. Метод equals() класса, представляющего выделенный элемент, отсутствует или сломан.
  3. Если задействован пользовательский Converter, он вернул неправильный объект в getAsObject(). Возможно, это даже null.

Чтобы решить эту проблему:

  1. Убедитесь, что точно такой же список сохранен во время последующего запроса, особенно в случае несколько каскадных меню. Создание бина @ViewScoped вместо @RequestScoped должно исправить его в большинстве случаев. Также убедитесь, что вы не выполняете бизнес-логику в методе getter <f:selectItem(s)>, а вместо этого в @PostConstruct или методе действия (слушателя). Если вы полагаетесь на конкретные параметры запроса, вам нужно будет явно хранить их в компоненте @ViewScoped или повторно передать их при последующих запросах, например. <f:param>. См. Также Как выбрать правильную область видимости бобов?
  2. Убедитесь, что метод equals() реализован правильно. Это уже сделано на стандартных Java-типах, таких как java.lang.String, java.lang.Number и т. Д., Но необязательно на пользовательских объектах / beans / entites. См. Также Правильный способ выполнения равного контракта . Если вы уже используете String, убедитесь, что кодировка символов запроса настроена правильно. Если он содержит специальные символы, а JSF сконфигурирован для визуализации вывода как UTF-8, но интерпретирует входные данные, например. ISO-8859-1, то он потерпит неудачу. См. Также a.o. Вход Unicode, полученный через входные компоненты PrimeFaces, поврежден .
  3. Отлаживать / регистрировать действия вашего пользовательского Converter и исправлять его соответствующим образом. Для рекомендаций см. Также Значение параметра ошибки преобразования для 'null Converter' Если вы используете java.util.Date в качестве доступных элементов с <f:convertDateTime>, убедитесь, что вы не забыли полную часть времени в шаблоне. См. Также "Ошибка проверки: значение недействительно" Ошибка

См. также:


Если кто-то может бросить некоторые советы по устранению неполадок / отладки для этой проблемы, это будет очень полезно.

Просто задайте здесь ясный и конкретный вопрос. Не задавайте слишком широких вопросов;)

122
ответ дан Community 19 August 2018 в 06:29
поделиться
  • 1
    Блестящий, равный метод заблудился – klonq 30 January 2012 в 21:39
  • 2
  • 3
    Также my f: selectItems - тип String, поэтому я уверен, что это не проблема преобразования, я думаю, что это причина, потому что список f: selectItems не существует во время фазы проверки. – Thang Pham 18 November 2012 в 22:23
  • 4
    – Agustí Sánchez 19 August 2014 в 17:28
  • 5
    Имея аналогичную ошибку. Я использую SelectItemsConverter , и этот компонент находится внутри отключенного набора полей, поэтому он также отключен. Это известное поведение? – Gilberto 4 September 2014 в 13:55

В моем случае я забыл реализовать правильные методы get / set. Это произошло потому, что я изменил множество атрибутов в процессе разработки.

Без надлежащего метода get JSF не может восстановить выбранный вами элемент и, как это делает BalusC, в пункте 1 его ответа:

1. Выбранный элемент отсутствует в списке доступных элементов. Это может произойти, если список доступных элементов обслуживается компонентом с включенным запросом, который неправильно повторно инициализируется при последующем запросе или неправильно выполняет деловое задание внутри метода getter, что приводит к тому, что он каким-то образом возвращает другой список.

1
ответ дан Henrique Liberato 19 August 2018 в 06:29
поделиться

Что сработало для меня:

У @FacesConverter есть getAsObject и getAsString, я должен был убедиться, что оба возвращают конкретные объекты, ничего null.

В моем классе, который используется selectOneMenu и преобразователем, я убедился, что equals() был перезаписан и правильно закодирован, на самом деле это была моя проблема, одна из проверок внутри equals() wasn Нехорошо и неверно вернулось.

0
ответ дан res 19 August 2018 в 06:29
поделиться

Это может быть проблема с конвертером или проблема с DTO. Попробуйте решить это, добавив методы hashCode () и equals () в ваш объект DTO; В приведенном выше сценарии вы можете сгенерировать эти методы в классе объекта Location, который указывается здесь как «DTO».

Пример:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + (int) (id ^ (id >>> 32));
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Location other = (Location) obj;
    if (id != other.id)
        return false;
    return true;
}
  • Обратите внимание, что выше Например, для «id» типа «long».
0
ответ дан Rizla Shareefdeen 19 August 2018 в 06:29
поделиться
  • 1
    Как указано в № 2 в принятом и очень высоком ответе – Kukeltje 16 August 2018 в 07:14
  • 2
    Почему вы повторяете уже данный ответ? – BalusC 18 August 2018 в 09:48
Другие вопросы по тегам:

Похожие вопросы: