Spring MVC - 带有Long类型的@ModelAttribute

时间:2015-08-25 22:12:27

标签: java spring spring-mvc java-ee

我尝试使用方法参数上的注释@ModelAttribute注入模型属性。

 public void insert() {
    String url = "http://myurl";
    Map<String, String> params = new HashMap<String, String>();
    params.put("item_name", "Droider");
    params.put("item_name", "chuyu");
    params.put("item_name", "solo");
    params.put("item_name", "shaq");



    CustomRequest jsObjRequest = new CustomRequest(Request.Method.POST, url, params, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            Log.d("Response: ", response.toString());

        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError response) {
            Log.d("Response: ", response.toString());
        }
    });
    MyApplication.getInstance().addToReqQueue(jsObjRequest);
}

但我总是得到下一个例外:

@RequestMapping({"/", "/index"})
public String home(Principal principal, Model model, @ModelAttribute("commerceId") Long commerceId) {
    if (commerceId == null) {
        LOGGER.info("Initializing commerce code...");
        String name = principal.getName();
        commerceId = Long.parseLong(name);
        model.addAttribute("commerceId", commerceId);
    }
    return "index";
}

我可以看到spring正在尝试使用no-arg构造函数创建Long值,但显然它会失败,因为Long类型没有no-arg构造函数。

为什么Spring无法使用@ModelAttribute正确创建Long类型? 是否可以使用@ModelAttribute注入任何Wrapper类型(Integer,Long等)?

我使用的是Spring 3.1.1

2 个答案:

答案 0 :(得分:1)

正如@ParagFlume所建议的那样,我可以将参数类型更改为String,但这会迫使我使用@ModelAttribute("commerceId")在所有方法中对Long进行强制转换。

我的解决方案是创建一个包含所有相关商业的Wrapper对象。

public class CommerceData {

    private Long commerceId;

    public Long getCommerceId() {
        return commerceId;
    }

    public void setCommerceId(Long commerceId) {
       this.commerceId = commerceId;
    }
}

当用户登录时,我创建了我的POJO CommerceData,然后将Long值设置为属性。由于我需要模型属性存在于会话中,因此我手动创建了ant而没有注入@ModelAttribute注释,因为Spring MVC声称该值不存在。

@Controller
@SessionAttributes("data")
public class IndexController {

    private static final Logger LOGGER = LoggerFactory.getLogger(IndexController.class);

    @RequestMapping({"/", "/index"})
    public String home(Principal principal, ModelMap model) {
        if (model.get("data") == null) {
            LOGGER.info("Inicializando código de comercio");
            CommerceData data = new CommerceData();
            String name = principal.getName();
            data.setCommerceId(Long.parseLong(name));
            model.addAttribute("data", data);
        }
        return "index";
    }
}

但我相信Spring MVC应该支持使用@ModelAttribute而不仅仅是POJO类来注入Wrappers值(Long,Integer,Double)。也许我错了,但我无法与@ModelAttribute("commerceId") Long commerceId合作。

答案 1 :(得分:-2)

原语在春天用@modelattribute更好地工作。 我也遇到了Long类型的问题,但是当使用很长时间问题就解决了。