Не удалось преобразовать значение типа ‘java.lang.Строка’ к требуемому типу (конфликт с CrudRepository)

#java #spring #spring-mvc #jpa #spring-data

#java #spring #spring-mvc #jpa #spring-данные

Вопрос:

У меня есть HTML-страница с текстовым полем и кнопкой.

Когда я заполняю поле и нажимаю enter, я получаю следующую ошибку.

Не удалось преобразовать значение типа 'java.lang.String' to required type '...model.Test'; nested exception is org.springframework.core.convert.ConversionFailedException: Не удалось преобразовать из типа [java.lang.String] в тип [java.lang.Integer] для значения ‘typedvaluehere’

Код приведен ниже.

Одна интересная вещь, которую я отметил, заключается в том, что при удалении extends CrudRepository<Test, Integer> из репозитория ошибка перестает возникать. Но я не могу этого сделать, потому что мне это нужно. Но показывает, что это, похоже, конфликт с CrudRepository.

Еще одна интересная вещь, которую я отметил, это то, что если я изменю private String test модель на что-то другое, например, private String name и обновлю getters / setters, она будет работать нормально. Даже с CrudRepository. Кажется, это не позволяет использовать поле с тем же именем, что и имя класса модели.

Полный проект доступен для скачивания по адресу: https://drive.google.com/file/d/1qfn73uGH6eUmJf8vtWZvbSn2IQiI0MzB/view?usp=sharing

AddTest.html

 <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="addtest" method="post">
<input type="text" name="test"/>
<input type="submit" name="btnAddTest" value="Add">
</form>
</body>
</html>
 

Контроллер

 @RequestMapping(value = "/addtest", params = "btnAddTest", method = RequestMethod.POST)
public ModelAndView addTest(@ModelAttribute Test test) {

    ModelAndView modelAndView = new ModelAndView("AddTest.html");
    return modelAndView;
}
 

Модель

 @Entity
@Table(name = "Tests")
public class Test implements Serializable{

    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int idTest;
        
    @Column(length=100)
    private String test;

    public int getIdTest() {
        return idTest;
    }

    public void setIdTest(int idTest) {
        this.idTest = idTest;
    }

    public String getTest() {
        return test;
    }

    public void setTest(String test) {
        this.test = test;
    }   
        
}
 

Репозиторий

 @Repository
@Transactional
public interface TestRepository extends CrudRepository<Test, Integer>{
    
}
 

Комментарии:

1. можете ли вы показать нам HTML-форму?

2. Привет @Aman. Я только что обновил вопрос, добавив полный HTML-код по вашему запросу. Это в значительной степени просто ввод и кнопка, которые я опубликовал ранее. Но добавил и остальные.

3. @Aman, я также добавил ссылку на проект для скачивания в вопросе выше.

4. Проверьте baeldung.com/spring-mvc-form-tutorial

Ответ №1:

ОБНОВЛЕНО:

Попробуйте обновить свою форму следующим образом:

 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
...
<form:form  action="addtest" method="post" modelAttribute="test">
    <form:input type="text" name="test"/>
    <form:input type="submit" name="btnAddTest" value="Add"/>
</form:form >
 

Или, поскольку вы добавили thymleaf, попробуйте следующее:

 <form action="#" th:action="@{/addtest}" th:object="${test}" method="post">
    <input type="text" th:field="*{test}" />
   <input type="submit" name="btnAddTest" value="Add">
</form>


@RequestMapping(value = "/addtest", params = "btnAddTest", method = RequestMethod.POST)
public String addTest(@ModelAttribute Test test, BindingResult bindingResult, Model model) {
    if (bindingResult.hasErrors()) {
        //errors processing
    }  
    model.addAttribute("test", new Test());

   return "AddTest";
}
 

Комментарии:

1. Это не сработало. Не распознал ModelAttribute=»Test» в теге формы.

2. Я попробовал опцию thymeleaf, поскольку я использую ее с html, а не с jsp. Страница формы не открывается. Отображается следующая ошибка: ни BindingResult, ни обычный целевой объект для имени компонента ‘test’ не доступны в качестве атрибута запроса

3. @jkfe странно, я также добавил тело метода контроллера. это определенно должно сработать.

4. вы загрузили проект, который я предоставил и выполнил на вашем компьютере?

5. Я на java 11.