【问题标题】:The request sent by the client was syntactically incorrect. in @ManyToOne relation Hibernate, Spring客户端发送的请求在语法上不正确。在@ManyToOne 关系 Hibernate, Spring
【发布时间】:2013-11-30 05:56:25
【问题描述】:

这是我在 StackOverflow 上的第一篇文章。对不起我的英语不好。我在 Spring MVC 和 Hibernate 项目中添加员工时遇到问题。我在tomcat 7.047上运行它。我认为问题出在 JSP 或 Hibernate 数据库映射上。当我以同样的方式添加一个部门时。 数据库中的 Oddzial 和 Pracownik 关系: Oddzial [or Department in English] 1 : n Pracownik[Employee]

错误输出:

HTTP 状态 400 -

输入状态报告 信息 描述客户端发送的请求语法错误。

我的员工 [Pracownik] 类:

@Entity
@Table(name = "pracownicy")
@Inheritance(strategy=InheritanceType.JOINED)
public class Pracownik implements Serializable {

private static final long serialVersionUID = -2556993070168215685L;

@Id
@GeneratedValue
private Integer pracownik_id;

@ManyToOne(cascade = {CascadeType.MERGE})
@JoinColumn(name="oddzial_id", nullable = false)
private Oddzial oddzial_id;
private String imie;
private String nazwisko;
private String adres_zamieszkania;
private String miasto;

@Column(columnDefinition = "enum('Pelny','Pol')")
@Enumerated(EnumType.STRING)
private Etat etat;
private String stanowisko;
private Double pensja;

@ManyToOne(cascade = {CascadeType.MERGE})
@JoinColumn(name="kierownik_id", nullable = true)
private Pracownik kierownik_id;
//getters and setters generated by eclipse
}

我奇怪的[部门]班级:

@Entity
@Table(name="oddzial")
public class Oddzial implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Integer oddzial_id;
private String miasto;
private String ulica;
//getters and setters generated by eclipse
}

我的员工控制器

@Controller
@RequestMapping(value="/pracownik")
public class PracownikController {

@Autowired
private PracownikService pracownikService;

@Autowired
private OddzialService oddzialService;

@RequestMapping(value="/add", method=RequestMethod.GET)
public ModelAndView addPracownikPage() {

    List<Oddzial> oddzialList = oddzialService.getOddzialy();       
    ModelAndView modelAndView = new ModelAndView("add-pracownik-form");
    modelAndView.addObject("pracownik", new Pracownik());
    modelAndView.addObject("oddzialy", oddzialList);
    return modelAndView;
}

@RequestMapping(value="/add", method=RequestMethod.POST)
public ModelAndView addingPracownik(@ModelAttribute Pracownik pracownik, HttpServletRequest request) {

    ModelAndView modelAndView = new ModelAndView("home");
    pracownikService.addPracownik(pracownik);
    String message = "Pracownik was successfully added.";
    System.out.println(message);
    modelAndView.addObject("message", message);
    return modelAndView;
}

我的 JSP - 员工表单的加法器: 我用过,还是一样。

<form:form method="POST" commandName="pracownik" action="${pageContext.request.contextPath}/pracownik/add.html">
<table>
<tbody>
<tr>
    <td>Oddzial ID:</td>
    <td><form:radiobuttons path="oddzial_id" items='${oddzialy}'/></td>
</tr>
<tr>
    <td>Imię:</td>
    <td><form:input path="imie" /></td>
</tr>
<tr>
    <td>Nazwisko:</td>
    <td><form:input path="nazwisko" /></td>
</tr>
<tr>
    <td>Pensja:</td>
    <td><form:input path="pensja" /></td>
</tr>
<tr>
    <td>Stanowisko:</td>
    <td><form:input path="stanowisko" /></td>
</tr>
<tr>
    <td>Adres:</td>
    <td><form:input path="adres_zamieszkania" /></td>
</tr>
<tr>
    <td><input type="submit" value="Add" /></td>
    <td></td>
</tr>
</tbody>
</table>
</form:form>

如果您需要更多信息,请写信。 提前感谢您的帮助。

Oddzial 和 adres_Zamieszkania 的获取器和设置器。

    public Oddzial getOddzial_id() {
    return oddzial_id;
}

public void setOddzial_id(Oddzial oddzial_id) {
    this.oddzial_id = oddzial_id;
}

    public String getAdres_zamieszkania() {
    return adres_zamieszkania;
}

public void setAdres_zamieszkania(String adres_zamieszkania) {
    this.adres_zamieszkania = adres_zamieszkania;
}

【问题讨论】:

  • 问题与映射等无关。这意味着随请求发送的数据无法转换为处理程序方法期望的任何内容。我认为罪魁祸首是 addingPracownik?在这种情况下,请检查您的请求负载是否可以转换为 Pracownik 实例。
  • 当我点击提交时,AddingPracownik 方法甚至没有启动。
  • 显示adres_zamieszkaniaoddzial_id 的getter。
  • public String getAdres_zamieszkania() { return adres_zamieszkania;} public void setAdres_zamieszkania(String adres_zamieszkania) { this.adres_zamieszkania = adres_zamieszkania; } public Oddzial getOddzial_id() { return oddzial_id; } 公共无效 setOddzial_id(Oddzial 奇数_id) { this.oddzial_id = 奇数_id; }
  • 您可以编辑您的问题并将其添加到那里。

标签: java spring hibernate spring-mvc


【解决方案1】:

您的表单具有以下元素

<form:radiobuttons path="oddzial_id" items='${oddzialy}'/>

填充
List<Oddzial> oddzialList = oddzialService.getOddzialy();       
ModelAndView modelAndView = new ModelAndView("add-pracownik-form");
modelAndView.addObject("pracownik", new Pracownik());
modelAndView.addObject("oddzialy", oddzialList);

这将为oddziaList List 中的每个对象创建一个html &lt;form&gt; &lt;input&gt; 元素。 value 属性的值将来自 Oddzial 类的 toString() 方法。不管那个值是什么,除非你有一个 Converter 来从 toString() 的返回值转换为 Oddzial 类型的对象,否则 Spring 将无法自己进行转换,因此会给你一个 400错误的请求。

你有两个选择:

  1. 实现并注册自定义org.springframework.core.convert.converter.Converter 以进行转换。
  2. &lt;form:radiobuttons&gt; 更改为包含常规&lt;input type="radio"&gt; 元素的c:forEach&gt;,其中包含Oddzial 对象的ID。在您的控制器中,使用该提交的 ID 查找适当的 Oddzial 对象并将其设置在 Pracownik 对象上,然后再将其提交给您的服务。

【讨论】:

  • 感谢您的回答。我使用了 2 个版本的解决方案,它可以工作!谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
相关资源
最近更新 更多