簡體   English   中英

Spring MVC數據綁定-基本類型

[英]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一起使用)


UPDATE

我做了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.E​​LException:無法將類型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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM