按照书中的例子,一直作到第3.1章使用JDBC读写数据时,在提交设计的taco表单时,报了以下的异常信息:java
Failed to convert property value of type java.lang.String to required type java.util.List for property ingredients; nested exception is java.lang.IllegalStateException: Cannot convert value of type java.lang.String to required type tacos.Ingredient for property ingredients[0]: no matching editors or conversion strategy found
异常的字面意思就是字符串的ingredients[0]
不能转换成tacos.Ingredient
,表单中的ingredients
是字符串固然不能自动的转换成tacos.Ingredient
对象,不过spring中是能够自定义转换器来进行转换的。web
添加以下的转换器,将String
转换成tacos.Ingredient
就能够了:spring
package tacos.web; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; import tacos.Ingredient; import tacos.data.IngredientRepository; @Component public class IngredientByIdConverter implements Converter<String, Ingredient> { private IngredientRepository ingredientRepo; @Autowired public IngredientByIdConverter(IngredientRepository ingredientRepo) { this.ingredientRepo = ingredientRepo; } @Override public Ingredient convert(String id) { return ingredientRepo.findById(id); } }
不添加上面的转换器,即便在第3.2章使用Spring Data JPA持久化数据,提交的taco表单也不会报错,由于tacos.Ingredient
已经进行对象到数据库的映射,即便不配置如上的转换器 ,也能成功的提交表单。在这种状况下,spring在遇到要要将String转换成tacos.Ingredient
时,会认为这个字符串就是他的主键,会根据这个字符串id查找到该对象,并将其加入List
中。数据库