2009-11-20 6 views
1

Pals, я снова застрял во время моей веб-разработки, я предоставляю пользователю несколько вариантов выбора для выбора многих параметров. Фрагмент страницы JSFОтправка <h: selectManyListBox> вызывает «Ошибка проверки: значение недействительно»

<h:selectManyListbox id="associatedAS" value="#{maintainForm.selectedAS}"> 
    <s:selectItems value="#{maintainForm.associatedAS}" var="as" label="#{as.name}" /> 
    <rmc:asConverter /> 
</h:selectManyListbox> 

, но проблема в том, что, когда отправить страницу я получаю сообщение об ошибке на консоли

sourceId=maintainForm:associatedAS[severity=(ERROR 2), summary=(maintainForm:associatedAS: Validation Error: Value is not valid), detail=(maintainForm:associatedAS: Validation Error: Value is not valid)]

Я не могу понять, почему это происходит, элемент я нахожусь отображение в списке не является строкой, поэтому я написал конвертер «asConverter» для преобразования значений из других объектов в строку и наоборот. Также значение, указанное выше в теге '# {maintainForm.selectedAS}', имеет тип List (selectedAS).

Любая помощь оценивается.

спасибо.

+0

На самом деле я уже реализовал метод equals и пользовательский конвертер, и он отлично работает с selectOneMenu, но я столкнулся с этим для selectManyListBox. Поэтому я не думаю, что конвертер будет проблемой. – ravinikam

+0

Вы используете Spring Faces? Если да, посмотрите здесь, jira.springframework.org/browse/FACES-4 –

+0

Нет, мы не используем пружинные поверхности. – ravinikam

ответ

2

Эта проблема возникает, когда вы отправляете некоторые значения на страницу, а затем переданы некоторые или все исходные значения, или некоторые новые значения добавлены на клиенте. Как вы уже знаете, JSF сохраняет свое состояние просмотра на сервере или клиенте, зависит от того, как вы его настроили, поэтому он проверяет компонент, используя это состояние при отправке. В вашем случае выяснилось, что значения, отправленные клиенту, уже не совпадают. Следовательно, вы получаете эту ошибку.

Если вы используете настраиваемый конвертер, как я описываю на странице конвертеров, вам необходимо предоставить рабочий метод equals для объекта, который вы пытаетесь преобразовать в и из. Если вы попытаетесь использовать метод равных по умолчанию или пушить реализацию, объект не будет правильно преобразовывать, что приведет к довольно неинтуитивному сообщению об ошибке: «Ошибка проверки: значение недействительно». - ref: crazysquirrel.com

Другой similar suggestion.

+0

благодарит за вас время Уксус. – ravinikam

+0

На самом деле я уже реализовал метод equals и пользовательский конвертер, и он отлично работает с selectOneMenu, но я столкнулся с этим для selectManyListBox. Поэтому я не думаю, что конвертер будет проблемой. – ravinikam

+0

Попробуйте поместить некоторые отладочные сообщения в метод equals, чтобы точно увидеть, что происходит. –

3

У меня была такая же проблема, как у Рави Никама. Метод Equals и конвертер реализованы, и он отлично работает с selectOneMenu, но он дает хороший Validation Error: Value is not valid с selectManyListBox. После поиска нескольких часов я нашел решение. selectManyListbox основан на javax.faces.component.UISelectMany. Javadoc из UISelectMany говорит:

 
Obtain the Converter using the following algorithm: 
If the component has an attached Converter, use it. 
If not, look for a ValueExpression for value (if any). The ValueExpression must point to something that is: 
* An array of primitives (such as int[]). Look up the registered by-class Converter for this primitive type. 
* An array of objects (such as Integer[] or String[]). Look up the registered by-class Converter for the underlying element type. 
* A java.util.Collection. Do not convert the values. 

Так что последний пункт в этом списке вызвало мою проблему: «Не преобразовывать значения».

я указан в лицах-config.xml

<converter> 
    <converter-for-class>... 
    <converter-class>... 
</converter> 

В h:selectManyListbox у меня не было нейтрализатор указано.

Я решил проблему путем добавления к граням-config.xml

<converter-id>myConv</converter-id> 

и путем добавления атрибута converter="myConv" к h:selectManyListbox тега.

+0

Спасибо большое :) –

+0

В частности, коллекции могут использовать только строки. См. «Основные ядро ​​JavaServer» от Geary & Horstmann 3rd edition, p. 163. Примерно: «Значение тега selectMany может быть сборником вместо массива, но ... элементы не могут быть преобразованы, потому что тип элемента коллекции неизвестен во время выполнения ... Это означает, что вы должны использовать коллекции только для строк ". – Pixel

Смежные вопросы