#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.