Java Spring MVC-@ModelAttribute具有长类型
我试图使用annotation@modeldattribute on方法参数注入一个模型属性Java Spring MVC-@ModelAttribute具有长类型,java,spring,spring-mvc,jakarta-ee,Java,Spring,Spring Mvc,Jakarta Ee,我试图使用annotation@modeldattribute on方法参数注入一个模型属性 @RequestMapping({"/", "/index"}) public String home(Principal principal, Model model, @ModelAttribute("commerceId") Long commerceId) { if (commerceId == null) { LOGGER.info("Initializing comm
@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";
}
但我总是会遇到下一个例外:
java.lang.NoSuchMethodException: java.lang.Long.<init>()
我可以看到spring正在尝试使用无参数构造函数创建Long值,但显然它将失败,因为Long类型没有无参数构造函数
为什么Spring无法使用@ModelAttribute正确创建长类型?
任何包装器类型都可以是整数、长等。。。是否被注入@modeldattribute
我正在使用Spring 3.1.1,例如:
@ModelAttribute("peson") Person person
首先,它尝试装箱一个没有参数构造函数的Person对象。然后调用setter方法来设置/填充各个属性的值
万一
@ModelAttribute("commerceId") Long commerceId
没有参数构造函数,也没有设置值的setter方法。原语包装类提供了arg基构造函数,也没有setter方法。因为一旦您初始化它,它就不允许您更改该值
尝试使用@RequestParamcommerceId Long commerceId,正如@ParagFlume所建议的,我可以将参数类型更改为String,但这将迫使我使用@ModelAttributecommerceId对Long-in-all方法进行强制转换 我的解决方案是创建一个包含所有与商业相关的包装器对象
public class CommerceData {
private Long commerceId;
public Long getCommerceId() {
return commerceId;
}
public void setCommerceId(Long commerceId) {
this.commerceId = commerceId;
}
}
用户登录后,我创建POJO CommerceData,然后将Long值设置为属性。因为我需要模型属性存在于会话中,所以我必须手动创建ant,而不是注入@modeldattribute注释,因为SpringMVC声明该值不存在
@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";
}
}
但我相信SpringMVC应该支持使用@ModelAttribute而不仅仅是POJO类注入包装器长、整数、双精度的值。也许我错了,但我无法使用@modeldattributecommerceid Long commerceId。原语在春季使用@modeldattribute时效果更好。
我也遇到了Long类型的问题,但当使用Long时,问题就解决了。您希望它有什么价值?这个值应该从哪里来?第一次它应该是空的,因为它还没有被设置。我认为你不理解模型属性是什么。你试过@RequestParam吗?正如你所说,在Long中没有空的构造函数。但它不是一个参数值,因此我无法将其用于该注释,也许我必须检查属性是否与模型类一起存在,而不是使用@ModelAttributetry@ModelAttributecommerceId String commerceId,然后将其转换为Long,它将起作用是的,使用字符串值起作用,因为它在未设置时给我一个空字符串。