2017-10-20 43 views
0

我遇到了控制器/虚拟机数据传输问题,无法找到任何解决方案。 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。由于某些被认为是客户端错误(例如,格式错误的请求语法,无效的请求消息框架或欺骗性请求路由),服务器无法或不会处理该请求。 你能帮我一下吗?它有什么问题?

+0

也许如果您取消注释此行:'//userService.update(user1);'... – Henry

+0

不幸的是,这并不能解决问题。我已经评论它只是为了检查它是不是错误的原因。 – Vampirenostra

回答

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

+0

谢谢你的观点。但它并没有太多的帮助,我仍然得到了HTTP状态400(((在我看来,.vm没有识别modelAttrinbute,Idea并不建议这么做),Maby应该有一些标签库,就像jsp?但它的方式是在教程中你已经发布了id does not wotk)) – Vampirenostra

+0

检查请求传递的参数我看到传入的唯一参数是:type和office。其余的不会(( – Vampirenostra

+0

))我发现HTTP 400是由办公室领域引起的,实际的对象在哪里被传输,有什么建议如何打败它呢? – Vampirenostra