2017-07-07 16 views
2

良い午後を新しいエンティティレコードを作成するときに、クライアントから送信されたリクエストが文法的に間違っていた、春MVC:

私は春のMVCへの初心者です。私は私のプロジェクトを実行している間、次のエラーで立ち往生しています。 "クライアントが送信したリクエストは構文的に間違っていました。

私のプロジェクトには、ManyToOne関係を持つチームと国という2つのエンティティがあります。どちらのエンティティも、mysqlデータベースで作成されたテーブルをマップします。

私はチームエンティティのみでプロジェクトを開始し、新しいチームを作成するためにクラス(DAO、コントローラ、サービスなど)とJSPを作成しました。

ここで、両方のエンティティを関連付けるCountryクラスを作成しました。新しいチームの国を選択するために、「add-team-form.jsp」にドロップダウンリストを追加しました。このページは正しく表示されます(すべての国がドロップダウンリストに表示されます)。ただし、「送信」をクリックして新しいチームを作成すると、「クライアントが送信したリクエストは構文的に正しくありません」というエラーが表示されます。

エラーを特定するために教えてください。私はそれが "add-team-form.jsp"にあると推測しています。

1 - エンティティチーム:

@Entity 
@Table(name="teams") 
public class Team implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Integer id; 

@Column(name = "name", length = 40, nullable = false) 
private String name; 

@Column(name = "rating", length = 6, nullable = false) 
private Integer rating; 

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "id_country", nullable = false) 
private Country country; 


public Integer getId() { 
    return id; 
} 
public void setId(Integer id) { 
    this.id = id; 
} 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public Integer getRating() { 
    return rating; 
} 
public void setRating(Integer rating) { 
    this.rating = rating; 
} 
public Country getCountry() { 
    return country; 
} 
public void setCountry(Country country) { 
    this.country = country; 
} 
} 

2 - エンティティ国:

@Entity 
@Table(name = "countries") 
public class Country implements Serializable{ 

@Id 
@Column(name= "id_country", length = 6) 
private String idCountry; 

@Column(name = "name", length = 255, nullable = false) 
private String name; 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "country") 
private List<Team> teams; 


public String getIdCountry() { 
    return idCountry; 
} 

public void setIdCountry(String idCountry) { 
    this.idCountry = idCountry; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 
} 

マイチームDAO

@Repository 
public class TeamDAOImpl implements TeamDAO { 

@Autowired 
private SessionFactory sessionFactory; 

private Session getCurrentSession() { 
    return sessionFactory.getCurrentSession(); 
} 

@Override 
public void addTeam(Team team) { 

    getCurrentSession().save(team); 
} 
} 

マイチームサービス

@Service 
@Transactional 
public class TeamServiceImpl implements TeamService { 

@Autowired 
private TeamDAO teamDAO; 

public void addTeam(Team team) { 
    teamDAO.addTeam(team);  
} 

私のチームコントローラ

@Controller 
@RequestMapping(value="/team") 
public class TeamController { 

@Autowired 
private TeamService teamService; 

@Autowired 
private FilterService filterService; 

@RequestMapping(value="/add", method=RequestMethod.GET) 
public ModelAndView addTeamPage() { 
    ModelAndView modelAndView = new ModelAndView("add-team-form"); 
    modelAndView.addObject("team", new Team()); 

    return modelAndView; 
} 

@RequestMapping(value="/add", method=RequestMethod.POST) 
public ModelAndView addingTeam(@ModelAttribute Team team) { 

    ModelAndView modelAndView = new ModelAndView("home"); 

    teamService.addTeam(team); 

    String message = "Team was successfully added."; 
    modelAndView.addObject("message", message); 

    return modelAndView; 
} 

@ModelAttribute("countryList") 
public Map<String, String> getCountryList(){ 

    Map<String, String> countryList = filterService.getCountries(); 
    return countryList; 
    } 

... 
} 

私の「アドオンチームform.jsp」

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 
<?xml version="1.0" encoding="ISO-8859-1" ?> 

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 
<title>Add team page</title> 
</head> 
<body> 
    <h1>Add team page</h1> 

<form:form method="POST" 
     modelAttribute="team" 
     action="${pageContext.request.contextPath}/team/add.html"> 
<table> 
    <tbody> 
    <tr> 
     <td>Name:</td> 
     <td><form:input path="name" /></td> 
    </tr> 
    <tr> 
     <td>Rating:</td> 
     <td><form:input path="rating" /></td> 
    </tr> 
    <tr> 
    <td><label>Country</label></td> 
    <td> 
     <form:select path="country.idCountry"> 
      <form:options items="${countryList}" /> 
     </form:select>  
    </td> 
    <tr> 
     <td><input type="submit" value="Add" /></td> 
     <td></td> 
    </tr> 

</tbody> 
</table> 
</form:form> 

</body> 
</html> 

あり日食のコンソールに表示エラーがありませんが、ここでは、ブラウザからの受信エラーイムです:パラメータが見つからないか、別の形式であると予想されるtype.Check値に変換することができませんされている場合は、一般的に受信されているエラーが発生した

HTTP Status 400 - 

type Status report 

message 

description The request sent by the client was syntactically incorrect. 
Apache Tomcat/7.0.47 
+0

にありますが、あなたは私たちに、完全なスタックトレースを表示することができますか? –

+0

@TanmayDelhikar私は、ブラウザから受信しているエラーで質問を更新しました。エクリプスのコンソールにエラーが表示されません。 – MiguelDuque

+0

ロギングをDEBUGに設定します。 Bootを使用している場合は、[how](https://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html)を参照してください。ブラウザにエラーが発生した場合は、サーバー側にも印刷されます。 –

答えて

1

私はここで見ることができるいくつかの問題があります - あなたは/ team/add.htmlを追加し、あなたのポストハンドラを打つことはありません。同じエンドポイントに投稿しているときにアクション属性は必要ありません。

<form:form method="POST" modelAttribute="team" > 

第二に、あなたはマップとして国を注入しているので、これらは、キー/値のペアのための文字列フィールドに値を結合するための素晴らしい作品ID /表示値です。この場合、Springはあなたの国ID(String)をteam.country(Country)フィールドにバインドしようとしていますが失敗します。Springを助けるには、データバインダーが必要です。あなたのコントローラに追加します。

@InitBinder 
public void initBinder (WebDataBinder binder) { 
    binder.registerCustomEditor(Country.class, new CountryEditor()); 
} 

プロパティエディタクラスを作成します。

public class CountryEditor extends PropertyEditorSupport { 
    @Override 
    public void setValue(Object value) { 
     super.setValue(value); 
    } 

    public String getAsText() { 
     if (getValue() == null) return null; 
     return ((Country) getValue()).getName(); 
    }; 

    public void setAsText(String text) throws IllegalArgumentException { 
     if (text != null) { 
      Country country = // something like filterService.getCountryById(text); 
      setValue(country); 
     } 
    }; 
} 

より多くの情報がSpring documentation

+0

ありがとうございます! – MiguelDuque

-1

リクエストとレスポンスを記録するか、ログレベルを "DEBUG"に設定すると、ログに正確なエラーが表示されます。