我尝试使用方法参数上的注释@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
答案 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类型的问题,但是当使用很长时间问题就解决了。