我遇到问题:在Spring MVC中选择。
第一个模型是 Azienda.java :
@Entity
@Table(name = "azienda")
public class Azienda implements Serializable {
private static final long serialVersionUID = 1787438745757438466L;
private Integer id_azienda; // This is what i want to put in my "from:select" and retrieve
private String ragione_sociale;
private String indirizzo;
public Azienda() {
}
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "VA06148AE14539F54E6601582", sequenceName = "azienda_id_azienda_seq")
@Column(name = "id_azienda", nullable = false)
public Integer getId_azienda() {
return this.id_azienda;
}
public void setId_azienda(Integer value) {
this.id_azienda = value;
}
@Column(name = "ragione_sociale", nullable = false, length = 10)
public String getRagione_sociale() {
return this.ragione_sociale;
}
public void setRagione_sociale(String value) {
this.ragione_sociale = value;
}
@Column(name = "indirizzo", nullable = false, length = 30)
public String getIndirizzo() {
return this.indirizzo;
}
public void setIndirizzo(String value) {
this.indirizzo = value;
}
}
继承自 Azienda.java 的第二个模型 Progetto.java 是:
@Entity
@Table(name = "progetto")
public class Progetto implements Serializable {
private static final long serialVersionUID = 908957127555871179L;
private int id_progetto;
private String nome;
private Integer costo;
private Date data_inizio;
private Date data_fine;
private Azienda azienda;
private String descrizione;
public Progetto() {
}
@ManyToOne(optional = false)
@JoinColumn(name = "azienda", referencedColumnName = "id_azienda")
public Azienda getAzienda() {
return this.azienda;
}
public void setAzienda(Azienda value) {
this.azienda = value;
}
@Column(name = "workpackage")
@OneToMany(mappedBy = "progetto")
public Collection<Workpackage> getWorkpackage() {
return this.workpackage;
}
public void setWorkpackage(Collection<Workpackage> value) {
this.workpackage = value;
}
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "VA06148AE14539F54E7001591")
@SequenceGenerator(name = "VA06148AE14539F54E7001591", sequenceName = "progetto_id_progetto_seq")
@Column(name = "id_progetto", nullable = false)
public int getId_progetto() {
return this.id_progetto;
}
public void setId_progetto(int value) {
this.id_progetto = value;
}
@Column(name = "nome", nullable = false, length = 30)
public String getNome() {
return this.nome;
}
public void setNome(String value) {
this.nome = value;
}
@Column(name = "descrizione", nullable = false, length = 180)
public String getDescrizione() {
return this.descrizione;
}
public void setDescrizione(String value) {
this.descrizione = value;
}
@Column(name = "costo", nullable = false)
public Integer getCosto() {
return this.costo;
}
public void setCosto(Integer value) {
this.costo = value;
}
@Column(name = "data_inizio", nullable = false)
public Date getData_inizio() {
return this.data_inizio;
}
public void setData_inizio(Date value) {
this.data_inizio = value;
}
@Column(name = "data_fine", nullable = false)
public Date getData_fine() {
return this.data_fine;
}
public void setData_fine(Date value) {
this.data_fine = value;
}
}
addProject的控制器是:
@Controller
public class ProjectController {
protected final Logger log = Logger.getLogger(ProjectController.class);
@Autowired
private AziendaService service;
@RequestMapping(value ="/addProject", method = RequestMethod.GET)
public String createProject(@ModelAttribute("progetto") Progetto progetto, Map<String, Object> model) {
log.info("initiale createProject method.....");
Collection<Azienda> collection = service.getAllCompany(); // Here i get all company in my DB
model.put("modelList", collection); // and i put them in this model to retrieve them in jsp
return "addProject";
}
@RequestMapping(value ="/addProject", method = RequestMethod.POST)
public void addProject(@ModelAttribute("progetto") Progetto progetto) {
log.info("initiale addProject method.....");
log.info("project name :"+progetto.getNome());
log.info("project costo :"+progetto.getCosto());
log.info("data_inizio :"+progetto.getData_inizio());
log.info("data_fine :"+progetto.getData_fine());
log.info("azienda :"+progetto.getAzienda());
}
带有Spring标签的jsp中的from是:
<form:form method="post" action="addProject.htm" commandName="progetto">
<table>
<tr>
<th>Project name:</th>
<td><form:input id="projectname" path="nome" type="text" class="inp-form" /></td>
<td></td>
</tr>
<tr>
<th>Project cost:</th>
<td><form:input id="projectcost" path="costo" type="text" class="inp-form" placeholder="Ex: 1.00"/></td>
<td></td>
</tr>
<tr>
<th>Start Date:</th>
<td>
<form:input id="startdate" path="data_inizio" type="text" class="inp-form"/>
</td>
</tr>
<tr>
<th>End Date:</th>
<td>
<form:input id="enddate" path="data_fine" type="text" class="inp-form" />
</td>
</tr>
<tr>
<th>Select Company:</th>
<td>
<form:select id="company" path="azienda" class="styledselect_form_1">
<form:option value="" label="--Please Select"/>
<form:options items="${modelList}" itemValue="id_azienda" itemLabel="ragione_sociale"/>
</form:select>
</td>
</tr>
<tr>
<th>Description:</th>
<td><form:textarea id="description" path="descrizione" cols="50" rows="8"
class="form-textarea" style="resize: none;"
maxlength="600"
onKeyPress="return ( this.value.length < 600 );"
placeholder="Maximun 600 characters.."></form:textarea></td>
<td></td>
</tr>
<tr>
<th> </th>
<td>
<input type="submit" value="" class="form-submit" />
<input type="reset" value="" class="form-reset" />
</td>
<td></td>
</tr>
</table>
<!-- end id-form -->
</form:form>
当我填写from时,我在Eclipse中有这个错误:
16:00:10,187 DEBUG [ExceptionHandlerExceptionResolver:] - Resolving exception from handler [public void spring.hibernate.controller.ProjectController.addProject(spring.hibernate.model.Progetto)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'progetto' on field 'azienda': rejected value [1,]; codes [typeMismatch.progetto.azienda,typeMismatch.azienda,typeMismatch.spring.hibernate.model.Azienda,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [progetto.azienda,azienda]; arguments []; default message [azienda]]; default message [Failed to convert property value of type 'java.lang.String[]' to required type 'spring.hibernate.model.Azienda' for property 'azienda'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String[]] to required type [spring.hibernate.model.Azienda] for property 'azienda': no matching editors or conversion strategy found]
16:00:10,187 DEBUG [ResponseStatusExceptionResolver:] - Resolving exception from handler [public void spring.hibernate.controller.ProjectController.addProject(spring.hibernate.model.Progetto)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'progetto' on field 'azienda': rejected value [1,]; codes [typeMismatch.progetto.azienda,typeMismatch.azienda,typeMismatch.spring.hibernate.model.Azienda,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [progetto.azienda,azienda]; arguments []; default message [azienda]]; default message [Failed to convert property value of type 'java.lang.String[]' to required type 'spring.hibernate.model.Azienda' for property 'azienda'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String[]] to required type [spring.hibernate.model.Azienda] for property 'azienda': no matching editors or conversion strategy found]
16:00:10,187 DEBUG [DefaultHandlerExceptionResolver:] - Resolving exception from handler [public void spring.hibernate.controller.ProjectController.addProject(spring.hibernate.model.Progetto)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'progetto' on field 'azienda': rejected value [1,]; codes [typeMismatch.progetto.azienda,typeMismatch.azienda,typeMismatch.spring.hibernate.model.Azienda,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [progetto.azienda,azienda]; arguments []; default message [azienda]]; default message [Failed to convert property value of type 'java.lang.String[]' to required type 'spring.hibernate.model.Azienda' for property 'azienda'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String[]] to required type [spring.hibernate.model.Azienda] for property 'azienda': no matching editors or conversion strategy found]
rejected value [1,]
1 是我的数据库中的数字ID
我试着解决它,但我找不到任何帮助...有人可以帮助我???
THX。
答案 0 :(得分:1)
您需要实现PropertyEditorSupport子类,以便从数据层检索Azienda类实例。
class AziendaEditor extends PropertyEditorSupport {
private AziendaService service;
public AziendaEditor(AziendaService service) {
this.service = service;
}
@Override
public void setAsText(String identifier) {
setValue(service.getAziendaFromId(identifier));
}
}
有关PropertyEditor的说明,请参阅Spring MVC type conversion : PropertyEditor or Converter?。
另外,不要忘记您需要在控制器的@InitBinder函数中注册PropertyEditor。
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Azienda.class, new AziendaEditor(service));
}