带有Spring MVC的X-editable Select2标签

时间:2013-12-02 18:37:25

标签: twitter-bootstrap spring-mvc jquery-select2 x-editable

我正在使用X-editable插件来更新包含多个字段和数据类型的表单。表单的每个元素都有一个name值,用于映射DTO中的Java属性。当使用Ajax提交表单时,所有值都匹配Java对象的相应字段,除了,对于TAGS数组,理论上应该匹配字符串列表但不知怎的,我得到{{1} }。

堆栈跟踪

NumberFormatException

选择2标记模式

[Request processing failed; nested exception is java.lang.NumberFormatException: For input string: ""] with root cause
java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:991)

“tags”属性从数据库加载值。

提交按钮

$('.issue-tags').editable({
                pk: 22,
                name: 'tags',                
                placement: 'top',      
                mode: 'popup',  
                select2: {                                  
                    tags: ${tags},
                    tokenSeparators: [",", " "]
                },                 
                ajaxOptions: {
                    type: 'put'
                }
          }); 

Java DTO

 $('#btn-submit').click(function() {                  

      $('.editable').editable('submit', {                      

           url: './updateForm.html', 
           ajaxOptions: {
               dataType: 'json'
           },                             
           success: function(data, config) {                                
               ...                          
           },
           error: function(errors) {
              ...
           }
       });                        

});

Spring MVC Controller

public class MyObjectDTO implements Serializable {

    private List<String> tags = new ArrayList<String>();
    ...
}

如果没有tags字段,表单会正确地将数据提交给控制器。

1 个答案:

答案 0 :(得分:3)

这些是我使Select2(标记模式)组件与Spring MVC一起使用所做的更改:

选择2标记模式(JavaScript)

$('#issue-tags').editable({
                pk: 22,
                name: 'tagsMap',                 
                placement: 'top',      
                mode: 'popup',                   
                emptytext: 'No hay etiquetas definidas',
                inputclass: 'input-large',
                select2: {              
                    tags: ${allTags},
                    tokenSeparators: [",", " "],
                    id: function (item) {
                        return item.text;
                    }
                },                  
                ajaxOptions: {
                    type: 'put'
                }   
          }); 

tagsMap是我的DTO类的一个对象,它在提交时保存标记:

选择2标记模式(HTML输入)

<a id="issue-tags" href="#" data-type="select2">${tagsByObject}</a>

其中tagsByObject包含由逗号分隔的标记字符串,由Select2用于显示我的对象的特定标记

Java DTO

public class MyObjectDTO implements Serializable {

    private List<String> tags = new ArrayList<String>();
    private Map<String, Object> tagsMap = new HashMap<String, Object>();
    ...
}

allTags JSON对象,解析为String ,填充Select2组件的下拉菜单,显示我的数据库中持久保存的所有当前标记

Spring MVC Controller

@RequestMapping(value="/showPage", method = RequestMethod.GET)
    public String showPage(Model model,  HttpServletRequest request){
    ...
            List<String> myTags = myObjectDTO.getTags();
            String tagsByComma = StringUtils.EMPTY;
            String allTags = StringUtils.EMPTY;

            if(!myTags.isEmpty()){
                for(int i = 0; i < myTags.size(); i++){
                    tagsByComma += myTags.get(i) + ", ";
                }               
                tagsByComma = tagsByComma.substring(0, tagsByComma.length() -2);
            }

            List<String> dbTags = myService.getTags();
            JSONArray array = new JSONArray();
            for(String s : dbTags){
                JSONObject obj = new JSONObject();
                obj.put("id", dbTags.indexOf(s));
                obj.put("text", s);
                array.put(obj);
            }

            allTags = array.toString();


            model.addAttribute("tagsByObject", tagsByComma);
            model.addAttribute("allTags", allTags.length() == 0 ? "[{}]" : allTags);
    ...
}

提交功能保持不变。