CampaignCitiesの都市とOneToOneの関係にあるエンティティキャンペーンがあります。次に、CampaignCitiesにはSet都市が含まれています。
キャンペーンエンティティ
@Entity
@javax.persistence.Table(uniqueConstraints={@UniqueConstraint(columnNames={"name","company_id"}), @UniqueConstraint(columnNames={"id"})})
public class Campaign implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Long id;
@NotEmpty
@Size(min=1, max=100)
private String name;
private Date startDate;
private Date endDate;
@Valid
private Deal deal;
@Valid
private Company company;
@OneToOne
private CampaignCities cities = new CampaignCities();
CampaignCitiesエンティティ
@Entity
public class CampaignCities {
private long id;
private Set<City> cities = new HashSet<City>();
@Id
@javax.persistence.GeneratedValue(strategy=GenerationType.AUTO)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@OneToMany
public Set<City> getCities() {
return cities;
}
public void setCities(Set<City> cities) {
this.cities = cities;
}
}
市の実体:
@Entity
public class City implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private Long id;
@javax.persistence.Id
@javax.persistence.GeneratedValue(strategy=GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
私のNewCampaignController
@SessionAttributes(value={"campaign", "campaignCities"})
@Controller
public class NewCampaignController {
//private static final Logger logger = LoggerFactory.getLogger(NewDealController.class);
@Autowired
private CampaignManager campaignManager;
@Autowired
private CityManager cityManager;
@Autowired
SimpleDateFormat dateFormat;
@Autowired
CustomDateEditor dateEditor;
@RequestMapping(value = "campaign/new", method = RequestMethod.GET)
public String showForm(Map<String, Object> model) {
//List<Campaign> campaigns = campaignManager.getCampaigns();
Campaign campaignForm = new Campaign();
CampaignCities cities = new CampaignCities();
cities.setCities(new HashSet<City>(cityManager.getCity()));
//campaignForm.setCities(cities);
model.put("campaignCities", cities);
model.put("campaign", campaignForm);
return "campaign/new";
}
@RequestMapping(value = "campaign/new", method = RequestMethod.POST)
public String processForm(@Valid Campaign campaignForm, BindingResult result, Map<String,Object> model) {
new CampaignValidator().validate(campaignForm, result);
if (result.hasErrors()) {
return "campaign/new";
}
this.campaignManager.saveCampaign(campaignForm);
model.put("campaign", campaignForm);
model.put("campaigns", this.campaignManager.getCampaigns());
return "campaign/added";
}
キャンペーンをフォームにレンダリングすることができ、以下を使用して都市のリストを正常にレンダリングしました。
<form:checkboxes items="${campaignCities.cities}" path="cities" itemLabel="name" itemValue="id" delimiter="<br/>" />
ただし、フォームを送信すると、次の検証エラーが発生します。
フィールド'cities'のオブジェクト'campaign'のフィールドエラー:拒否された値[2,1]; コード[typeMismatch.campaign.cities、typeMismatch.cities、typeMismatch.com.groupdealclone.app.domain.CampaignCities、typeMismatch]; 引数[org.springframework.context.support.DefaultMessageSourceResolvable:コード[campaign.cities、cities]; 引数[]; デフォルトメッセージ[都市]]; デフォルトメッセージ[タイプ'java.lang.String[]'のプロパティ値をプロパティ'cities'の必須タイプ'com.groupdealclone.app.domain.CampaignCities'に変換できませんでした。ネストされた例外はjava.lang.IllegalStateExceptionです:プロパティ'cities'のタイプ[java.lang.String[]]の値を必要なタイプ[com.groupdealclone.app.domain.CampaignCities]に変換できません:一致するエディターまたは変換戦略が見つかりません]
SpringMVC 3でこれを処理する方法を見つけようとしましたが、1日以上立ち往生して成功しませんでした。フォームでチェックしたリスト、セット、または都市をコントローラーに送信して、キャンペーンに追加したいだけです。返されたString[]を都市のリストまたはセットに変換できる変換の問題を回避するにはどうすればよいですか。
私が取り組んでいるプロジェクトはパブリックGitHubプロジェクトです。プロジェクトの名前がGroup-Deal-Cloneである場合は、ソースをダウンロードしてMavenを使用してセットアップできます。