Spring自定义转换器不适用 - 没有匹配的编辑器或转换

时间:2017-02-16 08:31:54

标签: hibernate spring-mvc spring-data thymeleaf

我使用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

0 个答案:

没有答案