【spring實戰第五版遇到的坑】3.1中的例子報錯

按照書中的例子,一直作到第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中。數據庫

相關文章
相關標籤/搜索