Spring表单绑定怎么做?无法将[java.lang.String]类型的值转换为所需类型

Nim*_*sky 5 java spring spring-mvc

这是我的表格:

<form:form modelAttribute="fooDTO">
fooCountry: 
<form:select path="country">
  <form:options items="${countries}" itemLabel="shortName" itemValue="id"/> 
</form:select>
Run Code Online (Sandbox Code Playgroud)

这是支持pojo:

public class FooDTO
{
  private Country country;
 //getters and setters present
}
Run Code Online (Sandbox Code Playgroud)

所选选项默认为fooDTO中的国家/地区值,这很好.但是提交表单时绑定失败了 - 我得到了上述错误,我是否必须在活页夹中注册自定义编辑器,还是有更简单的方法?国家几乎和你期望的一样,国家确实是控制器中填充的国家名单......

Gri*_*Dog 6

改变你的路径<form:select path="country.id">.这至少会在发布时为您id提供在Country对象内部填充的字段.


dig*_*oel 5

Spring 3 引入了 Converter SPI,这使得这变得非常容易。看一下文档中的 6.5

从文档中获取来源并放入您所在的国家/地区,您会执行类似的操作

package my.converter;

final class StringToCountry implements Converter<String, Country> {
    public Country convert(String source) {
        return // whatever you do to get a country from your string
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在 xml 配置中配置转换器

<bean id="conversionService"
      class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="my.converter.StringToCountry"/>
        </list>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

正如 GriffeyDog 指出的那样,您可能希望将国家/地区 ID 放入选择路径中,以便您可以通过 ID 或其他内容获取国家/地区,而不是通过国家/地区对象的 toString() 返回的任何内容。