JSF2.3: Тернарный тест для пустого или нулевого значения HashMap не выполняется с помощью javax.el.PropertyNotWritableException [duplicate]

Очистить и перестроить

. «Чистая» сборки может удалить «мертвую древесину», которая может быть оставлена ​​лежащей рядом с предыдущими сборками, неудачными сборками, неполными сборками и другими проблемами сборки.

В общем случае среда IDE или сборка будет включать в себя некоторую форму «чистой» функции, но это может быть неправильно настроено (например, в ручном файле) или может завершиться неудачей (например, промежуточные или результирующие двоичные файлы - только).

После завершения «очистки» убедитесь, что «чистый» преуспел, и весь сгенерированный промежуточный файл (например, автоматический файл makefile) был успешно удален.

Этот процесс можно рассматривать как конечный вариант, но часто является хорошим первым шагом ; особенно если недавно был добавлен код, связанный с ошибкой (локально или из исходного репозитория).

5
задан BalusC 4 September 2013 в 14:41
поделиться

1 ответ

Вы не можете использовать условный оператор ?: в выражениях значения и действия. Выражение значения выдало бы PropertyNotWritableException в форме submit, потому что синтаксис EL не представляет собой операцию записи, вместо этого это операция только для чтения. Выражение действия уже выбрало бы ELException: not a valid method expression для загрузки страницы, потому что синтаксис EL не представляет собой выражение метода, а выражение значения.

Вам нужно решить его по-другому, а затем таким образом, чтобы вы могли полностью избавиться от условного оператора ?: в выражениях значения и действия. Это может быть достигнуто несколькими способами:

  1. Использование абстрактного базового класса и файла тэга. В настоящее время имена методов вашего имени бэк-компонента, к сожалению, не выровнены таким образом, что они одинаковы для обоих классов. Вы выровнены только для свойства globalFilter, но методы прослушивания действий не используются. Я предлагаю переименовать их в filter() и resetFilter(). Затем вы можете извлечь абстрактный базовый класс из этих классов bean и использовать его в файле custom tag , например, следующим образом:
    <my:filter beanName="#{param.from eq 'TERMINAL' ? 'terminalsList' : 'merchantsList'}" />
    
    , который реализован следующим образом (если предположить, что эти beans являются областями запроса):
    <h:inputText value="#{requestScope[beanName].globalFilter}" size="50" />
    <h:commandButton value="Filter" actionListener="#{requestScope[beanName].filter}" />
    <h:commandButton value="Reset" actionListener="#{requestScope[beanName].resetFilter}" />
    
    (если ваш компонент находится в другой области, просто измените #{requestScope} соответственно, например #{viewScope})
  2. Использование JSTL для условного построения представления. Это действительно неуклюжий (не DRY ), но, возможно, проще для стартера и фактически единственный способ, если вы не можете изменить сигнатуры метода по какой-то неясной причине.
    <c:choose>
        <c:when test="#{param.from eq 'TERMINAL'}">
            <h:inputText value="#{terminalsList.globalFilter}" size="50" />
            <h:commandButton value="Filter" actionListener="#{terminalsList.filterTerminals}" />
            <h:commandButton value="Reset" actionListener="#{terminalsList.resetTerminalsFilter}" />
        </c:when>
        <c:otherwise>
            <h:inputText value="#{merchantsList.globalFilter}" size="50" />
            <h:commandButton value="Filter" actionListener="#{merchantsList.filterMerchants}" />
            <h:commandButton value="Reset" actionListener="#{merchantsList.resetMerchantsFilter}" />
        </c:otherwise>
    </c:choose>
    
9
ответ дан Community 25 August 2018 в 19:39
поделиться
Другие вопросы по тегам:

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