Java 如何处理带有SpringMVC3Form单选按钮标记的三态布尔值?

Java 如何处理带有SpringMVC3Form单选按钮标记的三态布尔值?,java,forms,spring,spring-mvc,binding,Java,Forms,Spring,Spring Mvc,Binding,我的一个对象中有一个三态布尔属性(true、false和null),我不知道如何使用Spring-Forms标记正确绑定它。我想使用一系列的3个单选按钮(true、false和null),但Spring似乎不喜欢我目前所尝试的 以下是支持的POJO: public class Spirit { /*** Private Fields **/ private Integer id; private String name; private Boolean isAli

我的一个对象中有一个三态
布尔属性(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;}
}
这是我正在使用的表单(不起作用):


名称
活泼
不适用:活的:死的:
我得到的错误是:

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)
严重:Servlet jsp的Servlet.service()引发异常 org.springframework.beans.NotReadablePropertyException:bean类[com.example.Spirit]的无效属性'isAlive':bean属性'isAlive'不可读或具有无效的getter方法:getter的返回类型是否与setter的参数类型匹配? 位于org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:707) 位于org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:699) 位于org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:98) 位于org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:224) 位于org.springframework.web.servlet.support.BindStatus。(BindStatus.java:120) 位于org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:174) 位于org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:194) 位于org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:160) 位于org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:147) 位于org.springframework.web.servlet.tags.form.AbstractCheckedElementTag.autogenerateId(AbstractCheckedElementTag.java:78) 位于org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:138) 位于org.springframework.web.servlet.tags.form.AbstractSingleCheckedElementTag.WriteAgContent(AbstractSingleCheckedElementTag.java:82) 位于org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102) 位于org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79) 在org.apache.jsp.WEB\u 002dINF.views.spirits.edit\u jsp.\u jspx\u meth\u sf\u 005fradiobutton\u 005f0(edit\u jsp.java:523) 在org.apache.jsp.WEB_002dINF.views.spirits.edit_jsp._jsp服务(edit_jsp.java:201)上

这是非常相似的,但这种情况下的解决方案是简单地将类型更改为
boolean
,而不是
boolean
。不幸的是,更改三态的get/set方法只能作为最后的选择。我做错了什么?

您不应该在JSP标记中指定
value=null
。这将导致浏览器在HTTP POST中发送值
isalive=null

由于无法将
“null”
(字符串)绑定到
布尔值,因此这会正确地抛出一个错误

如果用户未选择单选按钮,则浏览器将不会发送表单参数的任何内容(或者它将发送
isalive=
,我忘记了这一点,但这并不重要)。在这种情况下,Spring不会尝试绑定该字段,这将给POJO留下一个
isAlive
字段和
null


总之,如果您在HTML/JSP标记中设置
value=null
,您就是在告诉浏览器发布一个字符串literal
null
。最后,我使用了一个
框来表示JSP发送和绑定的值,然后通过javascript操纵UI来隐藏实际的选择框,并根据与自定义控件交互的用户对其进行更新


这非常有效,因为我最终需要3个以上的状态,但缺点是它需要一个额外的类来建模状态。

让用户不选择单选按钮很好,但是(不使用javascript)如何取消单选按钮呢?据我所知,本机浏览器用户界面无法做到这一点,这就是为什么我在第一位有3个单选按钮。它根本不会发送
isalive
。为什么需要取消选择?(如果您这样做,只需将布尔模型属性设置回null)。在这种情况下,您是否只需为“取消选择”选项设置
value=“
?请注意,根据,始终需要选择其中一个单选按钮。对于希望用户选择“true”、“false”或“unselected”的输入元素,下拉列表可能是更好的选择。@dbreaux-我需要建模一个真正的三态,因此5种不同的状态转换中的任何一种都是有效的,因此需要“unselected”。
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)