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
,您就是在告诉浏览器发布一个字符串literalnull
。最后,我使用了一个
框来表示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)