我目前正在修改网络应用程序,我对数据绑定有疑问。我有一个已经使用@RequestMapping映射的方法,并且在其中一个参数中我有一个原始整数类型,类似这样(下面的代码基本上是我的问题的摘要,而不是实际的代码):
@RequestMapping(value = "/processSomething" , method = RequestMethod.GET)
public String processSomething(@ModelAttribute("myValue") int myValue)
{
// Do something with "myValue".
}
当我运行Web应用程序时,我得到以下内容:
HTTP状态500 - 请求处理失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:不能 实例化bean类[int]:找不到默认构造函数;嵌套 异常是java.lang.NoSuchMethodException:int。()
这让我意识到数据绑定只适用于对象。我试图用Integer改变int,但我最终得到了一些非常类似的东西:
HTTP状态500 - 请求处理失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:不能 实例化bean类[java.lang.Integer]:没有默认构造函数 发现;嵌套异常是java.lang.NoSuchMethodException: java.lang.Integer的值。()
我知道@ModelAttribute允许我们使用Spring MVC模型进行数据绑定,如果模型不在那里,它将由Spring自动创建,然后返回。我究竟做错了什么?我忘了做什么?我是否需要为基本类型创建PropertyEditor?
有趣的是它与@RequestParam完美配合,但我不希望用户在URL中看到我的属性的值。
注意:我目前正在使用Spring Web MVC 4.1.1.RELEASE(使用MAVEN)
我做了tofindabhishek用户的建议。我创建了一个名为Inteiro的类(翻译为Integer),我将它用作@ModelAttribute,就像这样:
@RequestMapping(value = "/usuarios" , method = RequestMethod.GET)
public String getUsuarios(
Model model ,
@RequestParam("pag") int pagina ,
@ModelAttribute("total") Inteiro registros ,
@ModelAttribute("pesquisa") CriterioBuilder criterio ,
@ModelAttribute("id_sexo_f") Inteiro idSexF ,
@ModelAttribute("id_grupo_adm") Inteiro idGrpAdm )
{
// ...
}
Inteiro类基本上只有一个带有public和empty构造函数的int原语字段,以及set,get,equals和hashCode方法。上一个问题似乎已经解决,但在运行我的应用程序时,我遇到了这个问题:
HTTP状态500 - javax.el.ELException:无法转换 com.regra7.minhaapp.controle.wrap.Inteiro@3b类型类 com.regra7.minhaapp.controle.wrap.Inteiro to class java.lang.Long
这是Inteiro的源代码:
public class Inteiro
{
// #############################################################################################
// INSTÂNCIAS
// #############################################################################################
private int valor;
// #############################################################################################
// CONSTRUTORES
// #############################################################################################
public Inteiro()
{
this.valor = 0;
}
// #############################################################################################
// MODIFICADORES
// #############################################################################################
public void set(int valor) { this.valor = valor; }
// #############################################################################################
// ACESSO
// #############################################################################################
public int get() { return this.valor; }
// #############################################################################################
// EQUALS E HASHCODE
// #############################################################################################
@Override
public boolean equals(Object o)
{
if (o == null)
{
return false;
}
else if (o == this)
{
return true;
}
else if (o.getClass() != this.getClass())
{
return false;
}
Inteiro inteiro = (Inteiro) o;
return inteiro.get() == valor;
}
@Override
public int hashCode()
{
return valor;
}
}
出于什么原因,Spring抱怨无法将Inteiro转换为java.lang.Long?我不和Long合作。而且...... EL?这意味着"表达语言",对吗?这与我的一些JSP页面有关吗?我正在尝试开发一个显示搜索结果的JSP页面,在这个页面上我使用EL。我的JSP页面中是否有可能出现问题?
感谢您的帮助。
答案 0 :(得分:0)
public class ViewModel {
private Integer myValue;
}
使用Wrapper对象(ViewModel)捕获您的值并将ViewModel类绑定为模型属性,在这种情况下,您可以使用Wrapper(Integer)处理空值。如果您不想处理可以使用int的空值。
public class ViewModel {
private int myValue;
}