[英]Spring MVC Data Binding - primitive types
我目前正在修改Web應用程序,並且對數據綁定有疑問。 我有一個已使用@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]:找不到默認的構造函數;默認值為0。 嵌套異常是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類基本上只有一個int基本字段,帶有一個公共和空的構造函數,以及一個set,get,equals和hashCode方法。 先前的問題似乎已經解決,但是在運行我的應用程序時,我遇到了以下問題:
HTTP狀態500-javax.el.ELException:無法將類型com.regra7.minhaapp.controle.wrap.Inteiro類型的com.regra7.minhaapp.controle.wrap.Inteiro@3b轉換為類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? 我不和朗一起工作。 而且... EL? 那就是“表達語言”,對嗎? 這與我的某些JSP頁面有關嗎? 我正在嘗試開發一個顯示搜索結果的JSP頁面,並且在此頁面上使用EL。 我的JSP頁面是否有可能出現問題?
謝謝您的幫助。
public class ViewModel {
private Integer myValue;
}
使用Wrapper對象(ViewModel)捕獲您的值,並將ViewModel類綁定為模型屬性,在這種情況下,您可以使用Wrapper(Integer)處理空值。如果您不想處理空值,則可以使用int。
public class ViewModel {
private int myValue;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.