Как я могу обработать логическое состояние с тремя состояниями с метками радиокнопок Spring MVC 3 Form? - PullRequest
2 голосов
/ 20 июля 2011

У меня есть атрибут tri-state Boolean (true, false и null) в одном из моих объектов, и я не знаю, как правильно связать его с помощью тегов Spring Forms. Я хотел бы использовать серию из 3 переключателей (true, false и null), но кажется, что Spring не нравится то, что я пробую до сих пор.

Вот поддержка POJO:

public class Spirit {
    /*** Private Fields **/
    private Integer id;
    private String name;
    private Boolean isAlive;

    /*** Constructor **/
    public Spirit() {}

    /*** Getters **/
    public Integer getId() {return id;}
    public String getName() {return name;}
    public Boolean isAlive() {return isAlive;}

    /*** Setters **/
    public void setId(Integer id) {this.id = id;}
    public void setName(String name) {this.name = name;}
    public void isAlive(Boolean isAlive) {this.isAlive = isAlive;}
}

А вот форма, которую я использую (она не работает):

<sf:form method="POST" modelAttribute="spirit">
    <table>
        <tr>
            <th><label for="spirit_name">Name</label></th>
            <td><sf:input path="name" id="spirit_name" /></td>
        </tr>
        <tr>
            <th><label for="spirit_isAlive">Livelyness</label></th>
            <td>N/A: <sf:radiobutton path="isalive" value="null" /> Alive: <sf:radiobutton path="isalive" value="true" /> Dead: <sf:radiobutton path="isalive" value="false" /></td>
        </tr>
    </table>
    <sf:hidden path="id"/>
    <input type="submit" value="save" />                
</sf:form>

Ошибка, которую я получаю:

SEVERE: Servlet.service() for servlet jsp threw exception
org.springframework.beans.NotReadablePropertyException: Invalid property 'isAlive' of bean class [com.example.Spirit]: Bean property 'isAlive' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:707)
    at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:699)
    at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:98)
    at org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:224)
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:120)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:174)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:194)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:160)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:147)
    at org.springframework.web.servlet.tags.form.AbstractCheckedElementTag.autogenerateId(AbstractCheckedElementTag.java:78)
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:138)
    at org.springframework.web.servlet.tags.form.AbstractSingleCheckedElementTag.writeTagContent(AbstractSingleCheckedElementTag.java:82)
    at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
    at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)
    at org.apache.jsp.WEB_002dINF.views.spirits.edit_jsp._jspx_meth_sf_005fradiobutton_005f0(edit_jsp.java:523)
    at org.apache.jsp.WEB_002dINF.views.spirits.edit_jsp._jspService(edit_jsp.java:201)

Существует еще один вопрос , который очень похож, но решением в этом случае было просто изменить тип на boolean, а не Boolean. К сожалению, изменение методов get / set для tri-state доступно только в качестве последнего средства. Что я делаю неправильно?

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Не следует указывать value=null в теге JSP.Это приведет к тому, что браузер отправит значение isalive=null в HTTP POST.

Поскольку невозможно связать "null" (Строка) с Boolean, это справедливо приводит к ошибке.

Если переключатель не выбран пользователем, то браузер не отправит ничего для параметра формы (или отправит isalive=, я забыл, который - но это не имеет значения).В этом случае Spring не будет пытаться связать поле, в результате чего ваш POJO останется с полем isAlive со значением null.

Итак, в итоге - если вы установите value=null в HTML / JSPtag, вы говорите браузеру POST string literal null.Просто оставь это.

0 голосов
/ 10 октября 2012

В итоге я в итоге использовал <select> поле для значений, которые JSP отправлял и связывал, а затем манипулировал пользовательским интерфейсом через javascript, чтобы скрыть фактическое поле выбора и обновить его на основепользователь взаимодействует с пользовательскими элементами управления.

Это сработало довольно хорошо, поскольку в конечном итоге мне понадобилось иметь более 3 состояний, но недостатком является то, что для моделирования состояний требуется дополнительный класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...