2016-06-17 77 views
0

SpringとHibernateの動作について質問したいと思います。私はオブジェクト作成ページを作成しようとしていますが、何度か試してみると、あなたの助けを求めることになります。 Hibernate - BindingResultとBean名 'venueType'のプレーンターゲットオブジェクトはリクエスト属性として利用できません

I持つオブジェクト、他のオブジェクト、VenueType参照保有会場:

Venue.java

@Entity 
@Table(name = "VENUE") 
public class Venue extends CommonEntity { 

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

@NotEmpty 
@Column(name = "NAME", nullable = false, length = 60) 
private String name; 

@ManyToOne(optional = false) 
@JoinColumn(name = "VENUE_TYPE_ID") 
private VenueType venueType; 

@NotEmpty 
@Column(name = "ADDRESS", nullable = false, length = 100) 
private String address; 

@NotEmpty 
@Column(name = "TOWN", nullable = false, length = 60) 
private String town; (...) 

VenueType.java

@Entity 
@Table(name = "VENUE_TYPE") 
public class VenueType extends CommonEntity { 

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

@NotEmpty 
@Column(name = "NAME", nullable = false, length = 30) 
private String name; (...) 

Inを私のコントローラ、私は実装している他の簡単なクラスのようにしようとしました:

VenueController.java私の.jspファイルで

@Controller 
@RequestMapping(value = "/venue") 
public class VenueController { 

@Autowired 
private VenueService service; 
@Autowired 
private VenueTypeService venueTypeService; 

@RequestMapping(method = RequestMethod.GET) 
public String getAll(ModelMap model) { 
    model.addAttribute("venues", service.findAll()); 
    return Venue.getViewFolder() + "/" + "listAll"; 
} 

@RequestMapping(value = "/new", method = RequestMethod.GET) 
public String loadCreateVenuePage(ModelMap model) { 
    model.addAttribute("venueTypes", venueTypeService.findAll()); 
    model.addAttribute("venue", new Venue()); 
    return Venue.getViewFolder() + "/" + "create"; 
} 

@RequestMapping(value = "/new", method = RequestMethod.POST) 
public String createVenue(@ModelAttribute("venue") Venue venue) { 
    service.save(venue); 
    return "redirect:/venue"; 
} 

@RequestMapping(value = "/{id}", method = RequestMethod.GET) 
public String readVenuePage(@PathVariable("id") String id, ModelMap model) { 
    model.addAttribute("venueTypes", venueTypeService.findAll()); 

    Venue venue = service.findById(Integer.parseInt(id)); 
    model.addAttribute("venue", venue); 
    return VenueType.getViewFolder() + "/" + "update"; 
} 

@RequestMapping(value = "/update", method = RequestMethod.POST) 
public String updateVenue(@ModelAttribute("venue") Venue venue) { 
    service.update(venue); 
    return "redirect:/venue"; 
} 

、私は非常に単純なコードを持って、でもそれにCSSを適用していません。

会場/ create.jsp

<body> 
<h1>Creating Venue</h1> 

<form:form action="./new" method="POST" commandName="venue"> 
    <form:label path="name">Name</form:label> 
    <form:input path="name"/> 
    <br/> 

    <form:label path="address">Address</form:label> 
    <form:input path="address"/> 
    <br/> 

    <form:label path="town">Town</form:label> 
    <form:input path="town"/> 
    <br/> 

    <form:label path="postcode">Post Code</form:label> 
    <form:input path="postcode"/> 
    <br/> 

    <form:label path="country">Country</form:label> 
    <form:input path="country"/> 
    <br/> 

    <form:label path="venueType">Venue Type</form:label> 
    <form:select path="venueType"> 
     <form:option value="" label="Select an option"/> 
     <form:options items="${venueTypes}" itemValue="id" itemLabel="name"/> 
    </form:select> 

    <br/> 
    <input type="submit" value="Submit"/> 
</form:form> 

</body> 

「/新規」アドレスにアクセスしようとすると、例外java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'venueType' available as request attributeが発生します。私はいくつかの問題に出くわしました。ほとんどの場合、commandName/modelAttributeがないか、ModelMapに新しいオブジェクトが追加されています。問題の原因を突き止める手助けができたら、私は非常に感謝しています。前もって感謝します。

EDIT: 'venue/update.jsp'ページは 'venue/create.jsp'と同じですが、隠された 'id'フィールドが追加されています。

+0

PS :例外自体で示唆されているように、 "venueType"のプレーンオブジェクトを追加しようとすると、例外ページのロードが停止しますが、代わりに "venue"ページの代わりに対応する "venueType"ページがロードされます。 –

答えて

0

あなたがしなければならないすべては、平面オブジェクトを作成し、名前のmodelAttributecommandNameに等しいとして公開することで、あなたのケースでcommandNameが会場である、あなたのコントローラに、このメソッドを追加します。

@ModelAttribute("venue") 
public Venue plainVenue() { 
    return new Venue(); 
} 
+0

あなたのコメントをいただきありがとうございます。 "/ new"ページは正しく動作し、@InitBinderとPropertyEditorSupportが追加されていますが、 "/ {id}"情報ページは更新されません。それでも "venueType"バインディング例外がスローされます。それについてのアイデア? –

関連する問題

 関連する問題