【问题标题】:Getting a null value for in PathVariable在 PathVariable 中获取空值
【发布时间】:2018-10-20 10:33:55
【问题描述】:

我在 Spring 内的控制器中将值从 thymleaf 形式映射到路径变量时遇到问题。

索引文件中的表格:

      <!--/*@thymesVar id="fiatCurrency" type="java.lang.String"*/-->
            <form 
              th:action="@{'/values/' + ${fiatCurrency}}"  method="post"  >
              <select name="fiatCurrency" onchange="this.form.submit()">
                    <option   th:value="USD" th:text="USD"> </option>
                    <option  th:value="EUR" th:text="EUR"> </option>
                    <option   th:value="CNY" th:text="CNY"> </option>
              </select>
            </form>

控制器如下所示:

@Controller
public class DataController {

  private  ApiService apiService;

public DataController(ApiService apiService) {
    this.apiService = apiService;
}

@GetMapping(value = {"/values","/values/","", "/", "/index","/cryptos"} )
public String index(Model model){

    model.addAttribute("cryptos",apiService.getCrypto(100));

    return "index";
}

@PostMapping(value = "/values/{fiatCurrency}")
public String choseCurrency(Model model,@PathVariable String fiatCurrency){

    model.addAttribute("cryptos",apiService.getInDifferentValues(fiatCurrency));


    return "index";
}
}

我的问题是它总是返回空值,我正在努力如何在 PathVariable fiatCurrency 内绑定值 CNYEURUSD 形成index.html 表格。

【问题讨论】:

    标签: java spring rest null thymeleaf


    【解决方案1】:

    问题是,您正在尝试在页面呈现后动态更改表单操作属性。这不能使用 Thymeleaf 来完成,至少,你尝试的方式。请记住,Thymeleaf 在服务器端工作。因此,您有两种选择来完成此操作。

    • 不要使用路径变量,而是使用参数。
    • 使用 js 动态更改表单的操作。

    最简单的当然是第一个选项。因此,您需要更改控制器中的后期映射并更改参数的路径变量。

    为以下更改您的控制器方法。

    @PostMapping(value = "/values/fiatCurrency")
    public String choseCurrency(Model model,
                                @RequestParam("fiatCurrency") String fiatCurrency) {
        model.addAttribute("cryptos", apiService.getInDifferentValues(fiatCurrency));
        return "index";
    }
    

    你的 html 会像这样结束。

    <form id="fiatForm" th:action="@{/values/fiatCurrency}"  method="post">
       <select id="fiatSelect" name="fiatCurrency">
           <option th:value="USD" th:text="USD"> </option>
           <option th:value="EUR" th:text="EUR"> </option>
           <option th:value="CNY" th:text="CNY"> </option>
       </select>
    </form>
    

    如果您不想添加按钮来提交表单,那么添加这个jQuery 函数就可以解决问题。

    $("#fiatSelect").on("change", function() {
       $("#fiatForm").submit();
    })
    

    我已经尝试过这段代码,它已经在工作了。希望对您有所帮助。

    【讨论】:

    • 这是一个帮助,但我收到一个错误:无法处理请求 [POST localhost:8080/values/fiatCurrency]: 响应状态 400,原因是“必需的字符串参数 'fiatCurrency' 不存在”
    【解决方案2】:

    我的案例的答案是我将 PathVaribale 更改为 RequestBody 并且它可以工作。 我也尝试将其更改为 RequestParam @alain-cruz 但它给了我上面提到的错误。

    顺便说一句,我不得不切断我得到的一些变量,因为我知道它是@RequestBody String="fiatCurrency=EUR,所以我不得不摆脱 fiatCurrency=。

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 2018-10-23
      • 2019-06-28
      相关资源
      最近更新 更多