【问题标题】:form:select in spring MVC表单:在 Spring MVC 中选择
【发布时间】:2014-06-09 22:08:30
【问题描述】:

我对 Spring MVC 中的 from:select 有疑问。
第一个模型是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 from标签的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
我试图解决它,但我找不到任何帮助...有人可以帮助我吗??? 谢谢。

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案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));
    }
    

    【讨论】:

    • 感谢您的回答...但现在我在 eclispe 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.NumberFormatException: For input string: "1,"] 遇到了这个问题
    • 我解决了它,我拆分了那个字符串“1”,现在没问题了。谢谢你的帮助。。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多