Исключение приложения в подформах гобелена — параметр привязан к нулю

Я хочу создать подчиненную форму с гобеленом5:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:t="http://tapestry.apache.org/schema/tapestry
Render queue error in BeginRender[Index:testcomponent.name]: Failure reading parameter 'value' of component Index:testcomponent.name: Parameter 'name' of component Index:testcomponent is bound to null. This parameter is not allowed to be null.
3.xsd"> <t:TextField t:id="name" /> </html>

и используйте его так:

<form t:type="form" t:id="testForm">
    <t:testComponent name="name" />
    <input type="submit"/>
</form>

ТестКомпонент.java:

import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.annotations.Property;

public class TestComponent {

    @Parameter(required = true, allowNull = false)
    @Property
    private String name;
}

так что я могу использовать значение "имя", например:

@Property
private String name;

void onSuccessFromTestForm() {
    System.out.println(name);
}

Но все, что я получаю, это исключение приложения:

Render queue error in BeginRender[Index:testcomponent.name]: Failure reading parameter 'value' of component Index:testcomponent.name: Parameter 'name' of component Index:testcomponent is bound to null. This parameter is not allowed to be null.

В чем проблема?


person Nis Meinert    schedule 01.09.2013    source источник


Ответы (2)


Гобелен сообщает вам, что компонент, содержащий ваши Form и ваши TestComponent, имеет свойство «имя» со значением null. Таким образом, ваша проблема не в вашем TestComponent, а на один компонент/страницу выше. Присвойте значение имени, и все будет хорошо.

Изменить

Если вы хотите разрешить людям назначать значение через вашу форму и разрешать нулевые значения при отображении страницы, удалите allowNull = false из @Parameter в TestComponent. Я предполагаю, что вы хотите заставить пользователя указать значение для поля имени перед отправкой формы. Это делается в поле ввода путем добавления атрибута t:validate="required", а не в @Parameter. @Parameter сообщает гобелену, как переменная экземпляра взаимодействует со своим контейнером, но ничего не говорит о том, как переменная используется в своем собственном компоненте.

person joostschouten    schedule 01.09.2013
comment
Но я не хочу присваивать значение «имени». Пользователь должен ввести значение «имя» в форме/подформе, после чего я хочу использовать это значение — например, System.out.println(name); - person Nis Meinert; 04.09.2013
comment
Я изменил свой ответ на основе вашего комментария. Похоже, вы несколько неправильно истолковали использование @Parameter. - person joostschouten; 04.09.2013

Аннотация @Parameter похожа на параметр конструктора. По сути, ваш код говорит что-то вроде

public TestComponent(String name){
  if(name == null) thrown new Exception("No Nulls in here boy");
}

Хорошо, что вы это делаете, это предотвращает NullPointers в случае, если вы хотите выполнить некоторую обработку в компоненте, а поиск корня NPE - самая раздражающая вещь в мире. Более того, для параметра required установлено значение true, что означает, что вы должны передать какое-то значение компоненту. Вы должны инициализировать переменную имени чем-то, пустая строка достаточно хороша, так как она не испортит поведение, которого вы хотите достичь, но удовлетворит гобелен.

Это исправит вашу текущую техническую проблему. Что касается вашей реальной проблемы, с проверкой, как упоминал joostschouten, вам необходимо установить правила проверки. Этого можно добиться несколькими способами: либо добавьте t:validate, как упоминалось в joostschouten, либо добавьте onValidateFromName(String name) throws ValidationException{...} в компонент. Второй метод немного излишен для такой простой проверки, но может понадобиться для чего-то более сложного.

Некоторые ссылки по теме:

http://tapestry.apache.org/forms-and-validation.html http://tapestry.apache.org/component-parameters.html http://jumpstart.doublenegative.com.au/jumpstart/examples/input/validators http://jumpstart.doublenegative.com.au/jumpstart/examples/input/morevalidation

person Michal Gruca    schedule 12.09.2013