2015-09-07 132 views
2

首先我有两个表工作,类别,它是在图作为错误HTTP状态400 - 客户端发送的请求在语法上不正确。更新

Job to Cat

和我的实体是:

@Entity 
@Table(name = TableName.JOB_TABLE) 
public class Job { 


    @Id 
    @GeneratedValue 
    private Integer id; 

    private String title; 

    private String description;  

    @OneToMany(mappedBy = "job") 
    private List<Category> categories; 

    // omitting setters an getters for brevity 

} 

@Entity 
@Table(name = TableName.CATEGORY_TABLE) 
public class Category { 

    @Id 
    @GeneratedValue 
    private Integer id; 

    private String name; 

    @ManyToOne 
    @JoinColumn(name = "job_id") 
    private Job job; 

    // omitting setters an getters for brevity 

} 

JobService是

@Service 
public class JobService implements IDatabaseCrud<Job>{ 

    @Autowired 
    private JobRepository jobRepository; 

    @Autowired 
    private CategoryRepository categoryRepository; 

    public void saveCategory(Job job) { 
     List<Category> categories = job.getCategories(); 
     for (Category category : categories) { 
      category.setJob(job); 
      categoryRepository.save(category); 
     } 
    } 

    @Override 
    public void save(Job obj) { 
     // TODO Auto-generated method stub  
     jobRepository.save(obj); 
     saveCategory(obj); 
    } 
} 

现在我没有任何想法来保存新的工作,我必须从列表中选择多个类别来保存一个工作。

<form:form commandName="job"> 
    <form:input path="title"/><br> 
    <form:input path="company"/><br> 
    <form:input path="location"/><br> 
    <form:input path="url"/><br> 
    <form:input path="email"/><br> 
    <form:input path="description"/><br> 
    <form:select path="categories"> 
    <form:options items="${categories}" itemValue="id" itemLabel="name"/> 
    </form:select><br> 
    <form:input path="createdAt"/><br> 
    <form:input path="toApply"/><br> 
    <input type="submit" value="Add Job"> 
</form:form> 

上述形式并不提交数据到控制器,并给出错误HTTP状态400由客户机发送请求-The是语法不正确。以下控制器我想这些细节保存到数据库

@Controller 
public class JobController { 

    private static final Logger logger = LoggerFactory.getLogger(JobController.class); 

    @Autowired 
    private JobService jobService; 

    @Autowired 
    private CategoryService categoryService; 

    @ModelAttribute("job") 
    public Job constructJob() { 
     return new Job(); 
    } 

    @RequestMapping(value = "/jobs", method = RequestMethod.GET) 
    public String showJobs(Model model) { 
     model.addAttribute("jobs", jobService.findAll()); 
     return "jobs"; 
    } 

    @RequestMapping(value = "/jobs/{id}", method = RequestMethod.GET) 
    public String showJobDetail(Model model, @PathVariable Integer id) { 
     model.addAttribute("job", jobService.findJobWithCategories(id)); 
     return "job-detail"; 
    } 

    @RequestMapping(value = "/show-add-job", method = RequestMethod.GET) 
    public String showJobForm(Model model) { 
     model.addAttribute("categories", categoryService.findAll()); 
     return "add-job"; 
    } 

    @RequestMapping(value = "/show-add-job", method = RequestMethod.POST) 
    public String addJobDetail(@ModelAttribute("job") Job job) { 
     ///jobService.save(job); 
     List<Category> categories = job.getCategories(); 
     for (Category category : categories) { 
      logger.info("DEBUG job object", category); 
     } 
     return "redirect:/jobs"; 
    } 

} 

与上面的东西,我无法保存工作与类别,当我提出我得到HTTP Status 400形式。在形式上有些不妥。 This is URL该项目。

+0

你的web.xml没有春季调度员servlet定义,请添加定义,然后检查。 –

+0

@KrishnatMolawade当我使用[WebApplicationInitializer]时,web.xml中没有必要使用spring dispatcher servlet定义(http://docs.spring.io/autorepo/docs/spring-framework/3.1.x/javadoc-api /org/springframework/web/WebApplicationInitializer.html)。 –

+0

哦,我的坏...谢谢 –

回答

2

您遇到的问题与如何绑定类别有关,实际上您需要帮助框架解决它们。在WebDataBinder的帮助下。你应该添加类似

@InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.registerCustomEditor(Category.class, 
       new PropertyEditorSupport() { 

        @Override 
        public void setAsText(String text) { 
         // replace the dao with your appropriate repository call 
         Category category = dao.find(Category.class, 
           Integer.parseInt(text)); 
         setValue(category); 
        } 
       }); 
    } 

有关createdAt

你面对有你需要知道在哪儿格式您输入日期,框架的麻烦。例如,如果您以yyyy\MM\dd的格式传递日期,那么它只会起作用。 如果您使用其他格式,则只需使用@DateTimeFormat注释该属性即可。一个具体的例子,你可以用

@DateTimeFormat(iso= DateTimeFormat.ISO.DATE) 
@Column(name = "created_at") 
private Date createdAt; 

DateTimeFormat.ISO.DATEyyyy-MM-dd格式要求的日期注释Job类里面你的财产,或使用pattern属性,格式你喜欢

+0

我应该在哪里放置这个'@ InitBinder'方法?抓住我的项目并做出改变并让我知道请你好! –

+0

将它添加到您的'JobController'类中,如果您以'yyyy \ MM \ dd'之外的其他格式传递日期,则应该使用注释处理它。将添加到响应中。否则,你的代码是好的 –

+0

我有一个问题是如何保存当前的日期,而不是获得表单输入! –

0

你好我检查了您的代码,发现你有三个问题:一是相关意见后场 - createdAt,另一种是与applyTo场,另一个是categories领域。

关于使用日期的问题,您应该春天@InitBinder检查文档。 Here是一个很好的SO线程。基本问题是,春天不知道如何绑定dateString

类别字段的其他问题是,你应该实现一个Converter将这是一个数字Category类。看到here好的线程。

如果删除了所有三个字段 - applyTo,createdAt和类别,您的表单提交会工作。但如果你想按预期工作,请执行日期和转换器的@initBinder categories

相关问题