Spring + Velocity尝试保存对象失败

时间:2017-10-20 11:08:38

标签: java spring-mvc velocity

我遇到了控制器/虚拟机数据传输的问题,无法找到任何解决方案。 我有一个用户(见下面的课程)

    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 - 错误请求。由于被认为是客户端错误的东西(例如,格式错误的请求语法,无效的请求消息成帧或欺骗性请求路由),服务器不能或不会处理该请求。 你能帮帮我吗?这有什么问题?

1 个答案:

答案 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