java - 错误 HTTP 状态 400 - 客户端发送的请求在语法上不正确。更新

标签 java forms spring-mvc jpa

首先,我有两个表作业,类别,如图所示

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>

上面的表单没有向 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/

相关文章:

php - 使用 PHP 和 MySQL 编辑表单 : Best way to obtain an ID

javascript - 使用 JavaScript 根据复选框添加或删除输入字段

javascript - 点击按钮后 CSS 和 javascript 就消失了

java - 在Intellij Idea下使用Maven和ReactJS启动一个Spring Web应用程序项目

java - 在 Flink SQL Windows 中使用带有延迟的事件时间

java - 如何从加密密码中解密密码

java - 使用 Java 中的生产者和消费者防止有界执行程序服务中可能发生的死锁情况

java - 从索引优先级队列中删除 (java)

python - Mechanize br.click_link() 和 br.follow_link() 之间的区别

spring - HAL 与 Spring Hateoas 和 Mvc(无引导)