Spring MVC数据绑定 - 原始类型

时间:2015-01-09 00:04:40

标签: java spring web-services spring-mvc data-binding

我目前正在修改网络应用程序,我对数据绑定有疑问。我有一个已经使用@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.E​​LException:无法转换   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页面中是否有可能出现问题?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

public class ViewModel {
   private Integer myValue;
}

使用Wrapper对象(ViewModel)捕获您的值并将ViewModel类绑定为模型属性,在这种情况下,您可以使用Wrapper(Integer)处理空值。如果您不想处理可以使用int的空值。

public class ViewModel {
   private int myValue;
}