Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC-@ModelAttribute具有长类型_Java_Spring_Spring Mvc_Jakarta Ee - Fatal编程技术网

Java Spring MVC-@ModelAttribute具有长类型

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

我试图使用annotation@modeldattribute on方法参数注入一个模型属性

@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,它将起作用是的,使用字符串值起作用,因为它在未设置时给我一个空字符串。