form:在spring MVC中选择

时间:2014-04-24 14:35:10

标签: java spring spring-mvc

我遇到问题:在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>&nbsp;</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。

1 个答案:

答案 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));
}