首先,我有两个表作业,类别,如图所示
我的实体是:
@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>
上面的表单没有向 Controller 提交数据,并给出错误 HTTP Status 400 - 客户端发送的请求在语法上不正确。下面的 Controller 我想将这些详细信息保存到数据库
@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到那个项目。
最佳答案
您遇到的问题与您如何绑定(bind)类别有关,实际上您需要帮助框架解决它们,例如在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
注释该属性即可。 。一个具体的例子,您可以在 Job
类中注释您的属性
@DateTimeFormat(iso= DateTimeFormat.ISO.DATE)
@Column(name = "created_at")
private Date createdAt;
DateTimeFormat.ISO.DATE
需要采用 yyyy-MM-dd
格式的日期,或使用 pattern属性以及您喜欢的格式
关于java - 错误 HTTP 状态 400 - 客户端发送的请求在语法上不正确。更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32434072/