我使用Spring MVC 4.3.3,Data 1.10.4,Thymeleaf 3,Hibernate 4.3.5,Oracle 10g,JBoss Wildfly。
我有自定义对象,当控制器试图保存时,转换器没有启动; bindingResult有错误。
@Entity
public class Cat{
private CatType catType;
}
控制器
@PostMapping(value="/create", params={"save"})
public String save(final Cat cat,...){ //error here
if(bindingResult.hasErrors()){
return "cat/create";
}
...
}
我的Thymeleaf表单试图提交
<li>
<span>Type</span>
<select id=catType name="catType" th:field="*{catType}">
<option
th:each="catType: ${allCatTypes}"
th:value="${catType.getId()}"
th:text="${catType.getName()}">
Category type
</option>
</select>
</li>
相关错误是
org.springframework.validation.BeanPropertyBindingResult:1个错误 字段'catType'上对象'cat'中的字段错误:被拒绝的值[100];代码[typeMismatch.cat.catType,typeMismatch.catType,typeMismatch.ae.tbits.atn.aiwacore.common.model.CatType,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable:codes [cat.catType,catType];参数[];默认消息[catType]];默认消息[无法将类型[java.lang.String]的属性值转换为属性'catType'的必需类型[ae.tbits.atn.aiwacore.common.model.CatType];嵌套异常是java.lang.IllegalStateException:无法将类型[java.lang.String]的值转换为属性'catType'所需的类型[ae.tbits.atn.aiwacore.common.model.CatType]:没有匹配的编辑器或转换战略发现]
所以我创建了一个转换器(也尝试过格式化器)。
Thymeleaf config
public class ThymeleafConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
...
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(catTypeConverter());
super.addFormatters(registry);
logger.info("Added formatters");
}
@Bean
public CatTypeConverter catTypeConverter(){
return new CatTypeConverter();
}
}
我的转换器类
public class CatTypeConverter implements Converter<String, CatType> {
public CatTypeConverter(){
super();
}
@Override
public CatType convert(String source){
...
}
如果我在我的ThymeleafConfig.addFormatters()中放置断点,我可以看到我的转换器被添加到转换器集合中,它存在。但是后来当我打破控制器保存方法时,我的转换器从转换器集合中丢失了。神奇的是我的转换器正在被清除,因此我认为错误。
我研究过所有的SO,无法让它发挥作用。
其中,我遵循了这个:http://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html#the-conversion-service