【问题标题】:Trying to use an enum as an input working with thymeleaf尝试使用枚举作为与 thymeleaf 一起使用的输入
【发布时间】:2020-06-12 19:30:38
【问题描述】:

当我尝试使用 thymeleaf 通过 html 页面发出 POST 请求时出现问题。控制器应该以枚举的形式接收输入,但它会引发错误:

java.lang.NoSuchMethodException: com.trade_analysis.model.StockSymbol.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3427) ~[na:na]"

我不知道有什么问题。我已经看过一些示例并尝试了很多东西,但我无法让它发挥应有的作用。

HTML:

<select class="form-item" th:field="${symbol}" required>
    <option value="" selected disabled hidden id="default-symbol">Symbol</option>
    <option class="dropdown-menu-button" th:each="symbolOption: ${symbols}" th:value="${symbolOption}" th:text="${symbolOption}"></option>
</select>

Java 控制器:

    @GetMapping(value = "/stocks")
    @PreAuthorize(value = "isAuthenticated()")
    public String getStockPrices(Model model) throws UserNotFoundException {
        User user = userService.getUserByUsername(getUsername());
        String apiKey = user.getApiKey() == null ? "" : user.getApiKey();

        model.addAttribute("apiKey", apiKey);
        model.addAttribute("symbol", "");
        model.addAttribute("symbols", asList(StockSymbol.values()));

        return "stock-prices-preview";
    }

    @PostMapping(value = "/stocks")
    @PreAuthorize(value = "isAuthenticated()")
    public String stockPrices(@ModelAttribute String apiKey, @ModelAttribute StockSymbol symbol, Model model) {
        model.addAttribute("apiKey", apiKey);
        model.addAttribute("symbol", symbol);
        model.addAttribute("symbols", asList(StockSymbol.values()));

        return "stock-prices-preview";
    }

'StockSymbol' 枚举:

public enum StockSymbol {
    GOOGL("GOOGL"),
    MSFT("MSFT"),
    AMZN("AMZN"),
    IBM("IBM"),
    CSCO("CSCO"),
    AAPL("AAPL");

    String sys;

    StockSymbol(String sys) {
        this.sys = sys;
    }
}

前几行错误(完全错误开启:https://pastebin.com/kg8RR7G6

java.lang.NoSuchMethodException: com.trade_analysis.model.StockSymbol.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3427) ~[na:na]
    at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2631) ~[na:na]
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:216) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]

【问题讨论】:

  • enum 不是股票代码的好选择。每次您想添加或删除股票时,您都必须重新编译代码。
  • 我认为我不会经常更改这些符号,出于我的目的,我宁愿坚持使用枚举,但我会考虑这个选项。

标签: java spring spring-boot enums thymeleaf


【解决方案1】:

在您的 POST 处理程序中,您有这行:

public String stockPrices(@ModelAttribute String apiKey, @ModelAttribute StockSymbol symbol, Model model) {

删除@ModelAttribute 注释。您的问题是 Spring 在运行控制器方法时尝试实例化枚举。

使用@RequestParam按名称获取传入的POST参数。如果您的编译器不使用-parameters 开关,您可能需要在注解中指定参数名称。

【讨论】:

  • 谢谢你的回答,我会试试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多