Я изучаю Spring с помощью «Spring in action 5» и столкнулся с некоторой проблемой: когда я переключаюсь на Spring Data JPA из JDBC (который работает на 100% правильно) в главе 3, код перестает работать при попытке открытьглавная страница с ингредиентами тако.Я сделал несколько журналов, чтобы увидеть, что происходит, и обнаружил, что метод findById (String id) не может преобразовать мое значение из БД (или что-то в этом роде).Я использую MySQL.
Я пытался самостоятельно вызывать метод преобразователя convert (String id), используя @Autowired, но единственное, что я обнаружил, было то, что когда ключ неверен, появится другая ошибка.Так что данные видны.Я постараюсь предоставить здесь некоторый код, но я не уверен, что полезно, а что нет.Я получаю сообщение об ошибке при первой попытке что-то записать.Ошибки в IDE и в браузере разные.Вот полный проект https://github.com/thedistantblue/taco-cloud-jpa.
Вот мой конвертер:
public class IngredientByIdConverter implements Converter<String,
Ingredient> {
private IngredientRepository ingredientRepo;
@Autowired
public IngredientByIdConverter(IngredientRepository ingredientRepo) {
this.ingredientRepo = ingredientRepo;
}
@Override
public Ingredient convert(String id) {
log.info("In converter.convert(): "
+ingredientRepo.findById(id).toString());
Optional<Ingredient> optionalIngredient =
ingredientRepo.findById(id);
return optionalIngredient.orElse(null);
}
}
И класс контроллера:
@Slf4j
@Controller
@RequestMapping("/design")
@SessionAttributes("order")
public class DesignTacoController {
@ModelAttribute(name = "order")
public Order order() {
return new Order();
}
@ModelAttribute(name = "taco")
public Taco taco() {
return new Taco();
}
private final IngredientRepository ingredientRepository;
private TacoRepository designRepository;
private IngredientByIdConverter converter;
@Autowired
public DesignTacoController(IngredientRepository ingredientRepository,
TacoRepository designRepository,
IngredientByIdConverter converter) {
this.ingredientRepository = ingredientRepository;
this.designRepository = designRepository;
this.converter = converter;
}
@GetMapping
public String showDesignForm(Model model) {
List<Ingredient> ingredients = new ArrayList<>();
log.info(converter.convert("CARN").getName());
log.info("in DTC: " + ingredientRepository.findAll());
ingredientRepository.findAll().forEach(i -> ingredients.add(i));
В IDE:
java.lang.NumberFormatException: Для входной строки: "PROTEIN" в java.base / jdk.internal.math.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:2054) ~ [na: na] в java.base / jdk.internal.math.FloatingDecimal.parseDouble (FloatingDecimal.java:110) ~ [na: na] в java.base / java.lang.Double.parseDouble (Double.java:543) ~ [na: na]
В браузере:
Произошла непредвиденная ошибка (тип = Внутренняя ошибка сервера, статус = 500).Для входной строки: "PROTEIN";вложенным исключением является java.lang.NumberFormatException: для входной строки: «PROTEIN» org.springframework.dao.InvalidDataAccessApiUsageException: для входной строки: «PROTEIN»;Вложенное исключение - java.lang.NumberFormatException: для входной строки: «PROTEIN» в org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible (EntityManagerFactoryUtils.java:373)HibernateJpaDialect.java:255) при org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible (AbstractEntityManagerFactoryBean.java:527) в org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible (ChainedPersistenceExceptionTranslator.java:61) в org.springframework.dao.support.DataAccessUtils.translateIfNecessary (DataAccessUtils.java:242) при org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:153) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:186)