我有一个非常简单的对象叫做Move:
public class Move {
private String move;
public String getMove() {
return move;
}
public void setMove(String move) {
this.move = move;
}
}
我还有一个移动存储库(所有移动列表):
@Component
public class MoveRepository {
private List<Move>allMoves;
public void addMove(Move move){
allMoves.add(move);
}
public MoveRepository() {
this.allMoves = new ArrayList<>();
}
public void setAllMoves(List<Move> allMoves) {
this.allMoves = allMoves;
}
public List<Move> getAllMoves(){
return allMoves;
}
}
这是我的控制器:
@Controller
public class MoveController {
@Autowired
private MoveRepository moveRepository = new MoveRepository();
@GetMapping("/moveList")
public String listMoves (ModelMap modelMap){
List<Move> allMoves = moveRepository.getAllMoves();
modelMap.put("moves", allMoves);
return "moveList";
}
@GetMapping("/addMove")
public String addMoveForm(Model model) {
model.addAttribute("move", new Move());
return "addMove";
}
@PostMapping("/addMove")
public String addMoveSubmit(@ModelAttribute Move move) {
moveRepository.addMove(move); //Producing an error
return "moveAdded";
}
}
基本上,我想将使用网页“/ addMove”上的表单提交的移动添加到Move Repository中移动allMoves的列表中。但是,每当我单击网页上的提交按钮时,它都会产生500服务器错误。如果我删除了
moveRepository.addMove(move);
从我的代码然后一切正常,但当然移动不会被添加到移动存储库。
我也有我的html(使用thymeleaf)代码,以供参考:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Add Move</title>
</head>
<body>
<h1>Add a move</h1>
<form action = "#" th:action="@{/addMove}" th:object="${move}" method = "post">
<p>Move: <input type = "text" th:field="*{move}"/></p>
<p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>
</body>
</html>
答案 0 :(得分:0)
欢迎来到SO。
更改
@Autowired
private MoveRepository moveRepository = new MoveRepository();
到
@Autowired
private MoveRepository moveRepository;
这个想法是Spring应该通过依赖注入来处理对象的实例化。此外,请确保使用组件扫描(在XML或Java配置中)选取注释。
其他提示:
将一个名为move
的属性放在一个类中是非常有帮助的
同名。更具描述性的命名会更好
下一个阅读你代码的人。
如果您的团队允许,请尝试Project Lombok 摆脱样板代码。然后你可以这样做:
public class Move {
@Getter
@Setter
private String move;
}
甚至更好:
@Data
public class Move {
private String move;
}
如果您计划持久保存到数据库,请考虑使用@Repository
注释您的存储库。这也将通过Spring为您提供一些异常处理功能。