无法通过JSP中的表单保存多对多关系

时间:2017-10-16 11:14:18

标签: spring hibernate jsp model-view-controller many-to-many

上下文

我有一个包含三个实体的简单研讨会应用程序 - JobEmployeeCustomer。我正在尝试创建Web界面,在这种情况下将添加新的Job。 Job与EmployeeCustomer有很多关系。在Job实体中,还有EmployeeCustomer的列表。

问题

当我尝试使用新的Job通过HTTP发布我的请求时,我收到错误的请求400,其中包含说明:

  

由于某些原因,服务器无法或不会处理请求   被认为是客户端错误(例如,格式错误的请求)   语法,无效请求消息框架或欺骗性请求   路由)。

我不知道bug究竟在哪里。

添加CustomerEmployee的表单可以正常使用。

守则

实体:

  • 员工

    @Component
    @Entity
    public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Pattern (regexp="[a-zA-Z]+")
    @NotEmpty
    private String employeeName;
    @Pattern (regexp="[a-zA-Z]+")
    @NotEmpty
    private String employeeSurname;
    @ManyToMany(mappedBy = "employeeList")
    private List<Job> jobList;
    
    
    public Employee() {
    }
    
    public Employee(int id, String employeeName, String employeeSurname) {
        this.id = id;
        this.employeeName = employeeName;
        this.employeeSurname = employeeSurname;
    
    }
    
    public Employee(String employeeName, String employeeSurname) {
        this.employeeName = employeeName;
        this.employeeSurname = employeeSurname;
        }
    
    public List<Job> getJobList() {
        return jobList;
    }
    
    public void setJobList(List<Job> jobList) {
        this.jobList = jobList;
    }
    public String getEmployeeName() {
        return employeeName;
    }
    
    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }
    
    public String getEmployeeSurname() {
        return employeeSurname;
    }
    
    public void setEmployeeSurname(String employeeSurname) {
        this.employeeSurname = employeeSurname;
    }
    
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }}
    
  • 客户

    @Component
    @Entity
    public class Customer {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Pattern(regexp="[a-zA-Z]+")
    @NotEmpty
    private String CustomerName;
    @Pattern (regexp="[a-zA-Z]+")
    @NotEmpty
    private String CustomerSurname;
    @Pattern (regexp = "\\w+")
    @NotEmpty
    private String car;
    private int phonenumber;
    @ManyToMany(mappedBy = "customerList")
    private List<Job> jobList;
    
    public Customer(String customerName, String customerSurname, String car, int phonenumber) {
        CustomerName = customerName;
        CustomerSurname = customerSurname;
        this.car = car;
        this.phonenumber = phonenumber;
    }
    
    public Customer(int id, String customerName, String customerSurname, String car, int phonenumber) {
        this.id=id;
        CustomerName = customerName;
        CustomerSurname = customerSurname;
        this.car = car;
        this.phonenumber = phonenumber;
    
    }
    
    public Customer() {
    }
    
    public List<Job> getJobList() {
        return jobList;
    }
    
    public void setJobList(List<Job> jobList) {
        this.jobList = jobList;
    }
    
    public String getCustomerName() {
        return CustomerName;
    }
    
    public void setCustomerName(String customerName) {
        CustomerName = customerName;
    }
    
    public String getCustomerSurname() {
        return CustomerSurname;
    }
    
    public void setCustomerSurname(String customerSurname) {
        CustomerSurname = customerSurname;
    }
    
    public int getPhonenumber() {
        return phonenumber;
    }
    
    public void setPhonenumber(int phonenumber) {
        this.phonenumber = phonenumber;
    }
    
    public String getCar() {
        return car;
    }
    
    public void setCar(String car) {
        this.car = car;
    }
    
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }}
    
  • 工作

    @Component
    @Entity
    public class Job {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @NotEmpty
    @Pattern(regexp="[a-zA-Z]+")
    private String jobName;
    
    @ManyToMany(fetch = FetchType.EAGER)
    private List<Employee> employeeList;
    
    
    @LazyCollection(LazyCollectionOption.FALSE)
    @ManyToMany
    private List<Customer> customerList;
    
    public Job() {
    }
    
    public Job(String jobName, List<Employee> employeeList, List<Customer> customerList) {
        this.jobName = jobName;
        this.employeeList = employeeList;
        this.customerList = customerList;
    }
    
    
    
    public long getId() {
        return id;
    }
    
    public void setId(long id) {
        this.id = id;
    }
    
    public String getJobName() {
        return jobName;
    }
    
    public void setJobName(String jobName) {
        this.jobName = jobName;
    }
    
    public List<Employee> getEmployeeList() {
        return employeeList;
    }
    
    public void setEmployeeList(List<Employee> employeeList) {
        this.employeeList = employeeList;
    }
    
    public List<Customer> getCustomerList() {
        return customerList;
    }
    
    public void setCustomerList(List<Customer> customerList) {
        this.customerList = customerList;
    }}
    

DaoImpl

  • JobDaoImpl

    @Repository
    public class JobDaoImpl implements JobDao {
    
    @PersistenceContext
    EntityManager entityManager;
    
    @Override
    public List<Job> findAllJobs() {
        return entityManager.createQuery("select j from Job j order by j.id", Job.class)
                .getResultList();
    }
    
    @Override
    public Job addJob(Job job) {
        entityManager.persist(job);
        entityManager.flush();
        entityManager.refresh(job);
        return job;
    
    }}
    

服务

  • JobService

    @Service
    @Transactional
    public class JobService {
    
    private JobDao jobDao;
    
    public List<Job> findAllJobs(){
        return jobDao.findAllJobs();
    }
    
    public Job addNewJob(Job job){return jobDao.addJob(job);}
    
    public JobService(JobDao jobDao) {
        this.jobDao = jobDao;
    }
    

    }

控制器

  • JobController

    @Controller
    public class JobController {
    
    JobService jobService;
    EmployeeService employeeService;
    CustomerService customerService;
    
    public JobController(JobService jobService, EmployeeService employeeService, CustomerService customerService) {
        this.jobService = jobService;
        this.employeeService = employeeService;
        this.customerService = customerService;
    }
    
    //JOB INDEX
    @RequestMapping("job-index.html")
    public ModelAndView getJobIndex() {
        ModelAndView modelAndView = new ModelAndView("jobViews/jobIndex");
        return modelAndView;
    }
    //SHOW EMPLOYEES
    @RequestMapping("show-jobs.html")
    public ModelAndView getAllJobs() {
        ModelAndView modelAndView = new ModelAndView("jobViews/jobs");
        modelAndView.addObject("jobs", jobService.findAllJobs());
        return modelAndView;
    }
    
    //ADD NEW JOB GET METHOD
    @GetMapping(value = "add-job.html")
    public ModelAndView addNewJob(){
        return new ModelAndView("jobViews/addJob","job", new Job());
    }
    
    //ADD NEW JOB POST METHOD
    @PostMapping(value = "add-job.html")
    public ModelAndView addNewJob(@ModelAttribute Job job){
        return new ModelAndView("jobViews/addJobConfirmation","job",job);
    }
    
    @ModelAttribute("employeeInit")
    public List<Employee> initializeEmployees() {
        return employeeService.findAllEmployee();
    }
    
    @ModelAttribute("customerInit")
    public List<Customer> initializeCustomer(){ return customerService.findAllCustomer();}}
    

JSP视图

  • addJob.jsp

    <f:form method="post" modelAttribute="job">
    
    <p>Job name:<f:input path="jobName"/></p>
    
    <f:hidden path="id"/>
    
    <f:select path="employeeList" multiple="true">
        <f:options items="${employeeInit}" itemLabel="employeeSurname" itemValue="id"></f:options>
    </f:select>
    
    <f:select path="customerList" multiple="true">
        <f:options items="${customerInit}" itemLabel="customerSurname" itemValue="id"></f:options>
    </f:select>
    
    <button type="submit">Add</button>
    

0 个答案:

没有答案