【问题标题】:HTTP Status 400 – Bad Request Spring MVCHTTP 状态 400 - 错误请求 Spring MVC
【发布时间】:2021-09-24 11:44:51
【问题描述】:

我的应用程序出现问题。我创建了表单,单击“保存”后的用户应该转到保存的活动列表,不幸的是它没有,我得到以下问题,HTTP 状态 400 – 错误请求 输入状态报告

描述由于被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性请求路由),服务器无法或不会处理请求。

Apache Tomcat/9.0.37

我试过@RestController 但它不起作用。非常感谢您的帮助

这是我的模块类 Clean


@ToString
@Entity
@Table(name = "clean")
public class Clean {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @NotBlank
   private String clean;



   public Long getId() {
       return id;
   }

   public void setId(Long id) {
       this.id = id;
   }

   public String getClean() {
       return clean;
   }

   public void setClean(String clean) {
       this.clean = clean;
   }
}

表单控制器

@Controller
public class CleanFormController {

    private final UserRepository userRepository;
    private final CleanRepository cleanRepository;
    private final WeekRepository weekRepository;

    public CleanFormController(UserRepository userRepository, CleanRepository cleanRepository, WeekRepository weekRepository) {
        this.userRepository = userRepository;
        this.cleanRepository = cleanRepository;
        this.weekRepository = weekRepository;
    }

    @RequestMapping(value = "/clean/form")
    public String getCleanForm(Model model) {
        Clean clean = new Clean();
        model.addAttribute("clean", clean);
        return "cleanForm";
    }

    @RequestMapping(value = "/clean/remove/{id}")
    public String deleteById(@PathVariable Long id) {
        cleanRepository.removeClean(id);
        return "redirect:/clean/list";
    }



    @RequestMapping(value = "/clean/form", method = RequestMethod.POST)
    public String postClean(@ModelAttribute @Valid Clean clean, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "cleanForm";
        }
        cleanRepository.saveClean(clean);
        return "redirect:/clean/list";
    }

    @RequestMapping(value = "/clean/list", method = RequestMethod.GET)
    public String allClean(Model model) {
        List<Clean> cleanList = cleanRepository.findAll();
        model.addAttribute("cleans", cleanList);
        return "cleanList";
    }
}

存储库

public class CleanRepository {


    @PersistenceContext
    EntityManager entityManager;

    public Clean saveClean(Clean clean) {
        if (clean.getId() == null) {
            entityManager.persist(clean);
        } else {
            entityManager.merge(clean);
        }
        return clean;

    }

    public Clean readClean(Long id){
        return entityManager.find(Clean.class, id);
    }

    public Clean updateClean (Clean clean){
        entityManager.merge(clean);
        return clean;
    }

    public void removeClean(Long id) {
        Clean clean = entityManager.find(Clean.class, id);
        entityManager.remove(entityManager.contains(clean) ? clean : entityManager.merge(clean));

    }

    public List<Clean> findAll() {
        Query query = entityManager.createQuery("Select t from Clean t");
        return query.getResultList();
    }

    public Clean findById(Long id) {
        return entityManager.find(Clean.class, id);
    }

}

控制器

@Transactional
@Controller
public class CleanController {

    private final CleanRepository cleanRepository;

    public CleanController(CleanRepository cleanRepository) {
        this.cleanRepository = cleanRepository;
    }


    @RequestMapping(value = {"/add/clean"})
    @ResponseBody
    public String home() {
        Clean clean = new Clean();
        clean.setId(1l);
        clean.setClean("Ironing");
        cleanRepository.saveClean(clean);
        return "Clean: " + clean.getId();
    }


    @RequestMapping(value = "/clean/read/{id}")
    @ResponseBody
    public String readClean(@PathVariable long id) {
        Clean clean = cleanRepository.findById(id);
        return clean.toString();
    }

    @RequestMapping(value = "/clean/update/{id}/{name}")
    @ResponseBody
    public String updateClean(@PathVariable long id, @PathVariable String name) {
        Clean clean = cleanRepository.findById(id);
        clean.setClean(name);
        cleanRepository.updateClean(clean);
        return clean.toString();
    }

    @RequestMapping(value = "/clean/delete/{id}")
    @ResponseBody
    public String removeClean(@PathVariable long id) {
        Clean clean = cleanRepository.findById(id);
        return "Removed this clean";
    }

    @RequestMapping(value = {"/clean/all"})
    @ResponseBody
    public String cleanAll () {
        List<Clean> all = cleanRepository.findAll();
        return "Cleans: " + all.size();
    }
}

干净的表格

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<style>
    error {
        background-color: red;
    }
</style>
<body>

<form:form method="post" modelAttribute="clean" action="/clean/form">

            <p hidden><form:input path="id"/></p>

            <label for="clean">Clean</label>
            <form:input path="clean" id="clean"/>
            <form:errors path="clean" cssClass="error"/>

            <br>

            <input type="submit" value="Save">
        </form:form>

</body>
</html>

清理列表

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>

<table>
    <th>Id</th>
    <th>Clean</th>


        <c:forEach items="${cleans}" var="clean">
    <tr>
        <td>${clean.id}</td>
        <td>${clean.clean}</td>
    </tr>

    </c:forEach>
</table>

<a href="form">Add cleans</a>


</html>

【问题讨论】:

  • @DanyalSandeelo 这是一种风格改进,这里可以做很多事情,但这不是问题的原因。 OP,请注意,您似乎在这里使用过时的教程和设计;我推荐阅读官方的 Spring Boot 入门指南。

标签: java spring model-view-controller


【解决方案1】:

在控制器内部的构造函数上使用@Autowired

【讨论】:

    【解决方案2】:

    单击表单的提交按钮时,它会尝试转到“/clean/form” URL,但在控制器中,下面的代码 sn-p 在转到实际方法 @RequestMapping(value = “/clean/form”,方法 = RequestMethod.POST)。因为 @RequestMapping(value = "/clean/form") 这将接受任何请求。

     @RequestMapping(value = "/clean/form")
        public String getCleanForm(Model model) {
            Clean clean = new Clean();
            model.addAttribute("clean", clean);
            return "cleanForm";
        }
    

    因此,要克服这个问题,您有两种可能的方法来更改第一个是将上述代码的 RequestMapping 更改为 GetMapping 或者您可以更改表单操作 URL 和 @RequestMapping(value = "/clean/form", method = RequestMethod.POST) 相应的 URL。

    【讨论】:

    • 嗨,谢谢你的回答,但不幸的是它仍然失败
    • 您好,方法没有问题,但在表单中我有相同的路径名称,所以我不得不更改它,现在一切正常,再次感谢您的回答
    【解决方案3】:

    改变这两种方法:

        @GetMapping(value = "/clean/form")
        public String getCleanForm(Model model) {
            Clean clean = new Clean();
            model.addAttribute("clean", clean);
            return "cleanForm";
        }
    
        @PostMapping(value = "/clean/form")
        public String postClean(@ModelAttribute @Valid Clean clean, BindingResult
                bindingResult) {
            if (bindingResult.hasErrors()) {
                return "cleanForm";
            }
            cleanRepository.saveClean(clean);
            return "redirect:/clean/list";
        }
    
    

    【讨论】:

    • 谢谢你的回答,但它不起作用,同样的失败
    • 方法没有问题,但在形式上,但感谢您的帮助
    猜你喜欢
    • 2017-12-20
    • 2016-04-20
    • 1970-01-01
    • 2019-09-13
    • 2017-09-07
    • 2018-08-09
    • 1970-01-01
    • 2017-07-23
    • 2020-05-23
    相关资源
    最近更新 更多