【问题标题】:How to pass parameters in Spring Boot controller class (app is using Spring Security)如何在 Spring Boot 控制器类中传递参数(应用程序使用 Spring Security)
【发布时间】:2017-12-14 19:03:19
【问题描述】:

如上,如何传递参数?我已成功地将应用程序中上一页的 ID 参数传递到包含表单的页面的 URI。然后我想将此表单的内容连同相同的 ID 参数一起发布到我的数据库中。

我在我的应用程序中使用 Spring Security,我怀疑这可能是问题所在,因为如果我不尝试传递 ID 参数(即将我的表单数据对象发送到服务),我的表单的 POST 方法会按预期工作然后成功将数据保存到数据库的类)。但是,一旦我添加了旨在传递 ID 参数的代码,我就会收到 HTTP 405 错误(“不支持请求方法 'POST'”)。

包含表单的页面的 URI = http://localhost:8080/acceptOffer?id=(idvalue)

表格:

<form autocomplete="off" action="#" th:action="@{/acceptOffer}"
    th:object="${offer}" method="POST" class="form-horizontal"
    role="form">    

    Note 
    <label th:if="${#fields.hasErrors('note')}" th:errors="*{note}"
        class="validation-message"></label>
    <input type="text" th:field="*{note}" placeholder="Type Here"
        class="form-control" /> 

    <button type="submit">Accept Offer</button>
</form>

控制器方法:

@RequestMapping(value={"/acceptOffer?id={id}"}, method = RequestMethod.POST)
public ModelAndView acceptOffer(@Valid Offer offer, @PathVariable String id, BindingResult bindingResult){
    ModelAndView modelAndView = new ModelAndView();
    offerService.setId(Integer.valueOf(id));
    offerService.saveOffer(offer);
    modelAndView.addObject("successMessage", "Your offer of acceptance has been received");
    modelAndView.addObject("user", new User());     
    modelAndView.setViewName("acceptOffer");
    return modelAndView;
}           

【问题讨论】:

    标签: java spring model-view-controller spring-boot spring-security


    【解决方案1】:

    如果您使用的是路径变量,则将控制器代码更改为

    @RequestMapping(value={"/acceptOffer/{id}"}, method = RequestMethod.POST)
    public ModelAndView acceptOffer(@Valid Offer offer, @PathVariable String id, BindingResult bindingResult){
        ModelAndView modelAndView = new ModelAndView();
        offerService.setId(Integer.valueOf(id));
        offerService.saveOffer(offer);
        modelAndView.addObject("successMessage", "Your offer of acceptance has been received");
        modelAndView.addObject("user", new User());     
        modelAndView.setViewName("acceptOffer");
        return modelAndView;
    }
    

    然后这样称呼它

    http://localhost:8080/acceptOffer/id

    【讨论】:

    • 所以我认为我的 GET 方法中的 RequestMapping 注释应该从 @RequestMapping(value={"/acceptOffer"}, method = RequestMethod.GET) 更改为 @RequestMapping(value={ "/acceptOffer/"}, 方法 = RequestMethod.GET)
    • mapping 应该改成@RequestMapping(value={"/acceptOffer/{id}"}。你的问题说明了;是POST方法。你改成GET了吗?
    • 不,我现在指的是该表单的 POST 方法,因为包含该表单的页面的 URI 已根据您的回答进行了更改。当我尝试遵循您的回答时,当我尝试导航到表单时,我现在收到“不支持请求方法 'GET'”错误。我之前的 GET 方法(有效)的 RequestMapping 如上所述。
    • 上面有一个错字,现在编辑为时已晚,但它应该以“我现在指的是该表单的 GET 方法”开头。抱歉,来晚了。
    • 我已经修改了 URI 和控制器 POST 方法以符合您的建议,但恐怕无法让您的答案正常工作。您能否确认我的控制器的表单页面的 GET 方法的 RequestMapping 应该是什么?
    【解决方案2】:

    我没有以最初的方式解决这个问题,但我通过以下方式解决了这个问题:

    • 通过 URI 将参数传递给我的控制器的“GET”方法
    • 在控制器的“GET”方法中检索参数,然后 将其作为属性添加到 HttpSession
    • 在我的控制器的表单“POST”方法中将其作为会话属性取回

    我知道不理想,但它有效...

    【讨论】:

      猜你喜欢
      • 2022-07-29
      • 2017-03-06
      • 2019-05-08
      • 2021-02-08
      • 2020-12-15
      • 2020-02-09
      • 2020-03-20
      • 2016-08-26
      相关资源
      最近更新 更多