弹簧+速度不成功尝试保存对象
我遇到了控制器/虚拟机数据传输问题,无法找到任何解决方案。 Ive得到了一个用户(见下类)弹簧+速度不成功尝试保存对象
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
已尝试不同的方式,但仍然没有成功。 Whis this code I`m getting HTTP Status 400 - Bad Request。由于某些被认为是客户端错误(例如,格式错误的请求语法,无效的请求消息框架或欺骗性请求路由),服务器无法或不会处理该请求。 你能帮我一下吗?它有什么问题?
在你的代码中你缺少了一些东西。所有的 弗里斯特,你错过的形式指定的模型属性:
<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
谢谢你的观点。但它并没有太多的帮助,我仍然得到了HTTP状态400(((在我看来,.vm没有识别modelAttrinbute,Idea并不建议这么做),Maby应该有一些标签库,就像jsp?但它的方式是在教程中你已经发布了id does not wotk)) – Vampirenostra
检查请求传递的参数我看到传入的唯一参数是:type和office。其余的不会(( – Vampirenostra
))我发现HTTP 400是由办公室领域引起的,实际的对象在哪里被传输,有什么建议如何打败它呢? – Vampirenostra
也许如果您取消注释此行:'//userService.update(user1);'... – Henry
不幸的是,这并不能解决问题。我已经评论它只是为了检查它是不是错误的原因。 – Vampirenostra