我遇到了控制器/虚拟机数据传输的问题,无法找到任何解决方案。 我有一个用户(见下面的课程)
package com.Entity;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.*;
import java.util.Date;
@Entity
@Transactional
@Table(name = "USERS")
public class User {
private Long id;
private UserType type;
private String email;
private String password;
private String name;
private String tel;
private Date regDate;
private Date lastActive;
private Agent office;
//Constructors
public User(){
}
public User(UserType type, String email, String password, String name, String tel, Agent office) {
this.type = type;
this.email = email;
this.password = password;
this.name = name;
this.tel = tel;
this.regDate = new Date();
this.lastActive = null;
this.office = office;
}
//Getters
@Id
@SequenceGenerator(name = "USERID_SEQ", sequenceName = "USERID_SEQ",allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERID_SEQ")
@Column(name = "ID")
public Long getId() {
return id;
}
@Column(name = "TYPE")
public UserType getType(){
return type;
}
@Column(name = "EMAIL")
public String getEmail() {
return email;
}
@Column(name = "PASSWORD")
public String getPassword() {
return password;
}
@Column(name = "NAME")
public String getName() {
return name;
}
@Column(name = "TEL")
public String getTel() {
return tel;
}
@Column(name = "DATE_REG")
public Date getRegDate() {
return regDate;
}
@Column(name = "LAST_ACTIVE")
public Date getLastActive() {
return lastActive;
}
@ManyToOne (targetEntity = Agent.class, fetch = FetchType.EAGER)
@JoinColumn(name = "OFFICEID")
public Agent getOffice() {
return office;
}
// Setters
}
控制器
package com.Controllers;
import com.Entity.AgentType;
import com.Entity.User;
import com.Services.AgentService;
import com.Services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
//TODO: TEST CONTROLLER SUBJECT TO DELETE
@Controller
public class ViewController {
@Autowired
private UserService userService;
@Autowired
private AgentService agentService;
@RequestMapping(value = "/list", method = RequestMethod.GET)
public ModelAndView listUsersPage(){
List<User>list = userService.getAll();
return new ModelAndView("fragments/userss.vm","users",list);
}
@RequestMapping(value = "/edit/{id}", method = RequestMethod.GET)
public ModelAndView edit(@PathVariable Long id){
return new ModelAndView("fragments/edit.vm",
"user", (User)userService.getById(id));
}
//FUNCTIONAL
@RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
public ModelAndView delete(@PathVariable Long id){
userService.delete(userService.getById(id));
return new ModelAndView("redirect:/list");
}
@RequestMapping(value = "/update", method = RequestMethod.POST)
public ModelAndView update(User user){
User user1 = user;
//userService.update(user1);
return new ModelAndView("redirect:/list");
}
//Model Attributes
@ModelAttribute
public void userTypesList(Model model){
model.addAttribute("types", userService.getPositions());
}
@ModelAttribute
public void officesList(Model model){
model.addAttribute("offices", agentService.getAllByType(AgentType.OFFICE));
}
}
以及用于添加新用户或编辑现有用户的页面(.vm)(仅编辑页面的一个示例):
<title>EDIT USER</title>
<body>
<form method="post" action="/update">
id:
<input type="text" name="id" path="id" value="$user.id"/> <br>
Type:
<select name="type" path="type">
<option hidden selected>$user.type</option>
#foreach($type in $types)
<option value="$type">$type</option>
#end
</select> <br>
e-mail:
<input type="text" name="email" path="email" value="$user.email"/> <br>
Password:
<input type="text" name="password" path="password" value="$user.password"/> <br>
Name:
<input type="text" name="name" path="name" value="$user.name"/> <br>
Tel:
<input type="text" name="tel" path="tel" value="$user.tel"/> <br>
Reg Date:
<input type="date" name="regDate" path="regDate" value="$user.regDate"/> <br>
Last Active:
<input type="date" name="lastActive" path="lastActive" value="$user.lastActive"/> <br>
Office:
<select name="office" path="office">
<option hidden selected value="$user.office">$user.office.name</option>
#foreach($office in $offices)
<option value="$office">$office.name</option>
#end
</select> <br>
<input type="submit" value="Update"/>
</form>
</body>
问题是我可以t manage to save the updated User via /update(User user). I
尝试不同的方式,但仍然没有成功。
这个代码我得到HTTP状态400 - 错误请求。由于被认为是客户端错误的东西(例如,格式错误的请求语法,无效的请求消息成帧或欺骗性请求路由),服务器不能或不会处理该请求。
你能帮帮我吗?这有什么问题?
答案 0 :(得分:0)
在你的代码中你缺少一些东西。 首先,你错过了表格中指定的模型属性:
<form method="post" action="/update" modelAttribute="user">
其次,您缺少post方法中指定的模型属性:
@RequestMapping(value = "/update", method = RequestMethod.POST)
public ModelAndView update(@ModelAttribute("user") User user){
User user1 = user;
userService.update(user1);
return new ModelAndView("redirect:/list");
}
如果您需要更多详细信息,请参阅Getting Started with Forms in Spring MVC