在PathVariable中获取空值

时间:2018-10-20 10:33:55

标签: java spring rest null thymeleaf

我在 Spring 内无法在Controller中将值从百里香形式映射到pathvariable时遇到问题。

索引文件中的表格:

      <!--/*@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";
}
}

我的问题是,它总是返回空值,并且我正在努力将{strong> CNY , EUR 的值绑定在PathVariable fiatCurrency内>或 USD 形式的index.html形式。

2 个答案:

答案 0 :(得分: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();
})

我已经尝试过此代码,并且它已经可以工作了。希望对您有所帮助。

答案 1 :(得分:0)

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

它确实不得不删除了我得到的变量,因为我知道它是@RequestBody String="fiatCurrency=EUR,所以我不得不摆脱fiatCurrency =。

欢呼