【问题标题】:error HTTP Status 400 -The request sent by the client was syntactically incorrect. updated错误 HTTP 状态 400 - 客户端发送的请求在语法上不正确。更新
【发布时间】:2015-12-02 17:42:55
【问题描述】:

首先我有两个表格作业,类别在图表中为

我的实体是:

@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 - 客户端发送的请求在语法上不正确。 跟随控制器我想将这些详细信息保存到数据库

@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 到那个项目。

【问题讨论】:

  • 你的web.xml没有定义spring dispatcher servlet,请添加定义后再检查。
  • @KrishnatMolawade 当我使用WebApplicationInitializer 时,web.xml 中不需要 spring 调度程序 servlet 定义。
  • 哦,我的错...谢谢
  • 您向我们展示了什么观点?那是“附加工作”吗?
  • 我没有在视图中看到实际访问“/show-add-job”的链接。您只是手动导航到那里吗?

标签: java forms spring-mvc jpa


【解决方案1】:

您遇到的问题与您如何绑定类别有关,实际上您需要帮助框架解决它们,例如在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 属性和您喜欢的格式

【讨论】:

  • 我应该把这个@InitBinder方法放在哪里?抓住我的项目并进行更改并让我知道会很棒!
  • 将它添加到您的JobController 类中,同样如果您以yyyy\MM\dd 以外的其他格式传递日期,您应该使用注释来处理它。将添加到响应中。否则,你的代码没问题
  • 我有一个问题是如何保存当前日期而不是获取表单输入!
  • 我在设置 createdAt 时仍然遇到问题,导致错误 HTTP 状态 400 - 客户端发送的请求在语法上不正确
  • 我不知道这是好主意还是坏主意,但我已更新为@RequestMapping(value = "/show-add-job", method = RequestMethod.POST) public String addJobDetail(@ModelAttribute("job") Job job) { job.setCreatedAt(new Date());// Adding date here not from form jobService.save(job); return "redirect:/jobs"; }
【解决方案2】:

您好,我查看了您的代码,发现您有三个问题:一个与提交日期字段有关-createdAt,另一个与applyTo字段有关,另一个与categories有关场地。

关于日期的问题,您应该查看 spring @InitBinder 的文档。 Here 是一个很好的 SO 线程。基本问题是spring不知道如何将date绑定到String

类别字段的其他问题是您应该实现一个Converter,它将categoryId(一个数字)转换为Category 类。见here好线程。

如果您删除所有三个字段 - applyTo、createdAt 和类别,您的表单提交将起作用。但如果你想按预期工作,请为日期实现@initBinder,为categories实现Converter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多