Spring JPAFailed для преобразования из типа [java.lang.String] в тип [java.lang.Long] для значения «Почему?» - PullRequest
0 голосов
/ 13 октября 2018

Я не понимаю, почему, когда я пытаюсь использовать форму modelAttributed в Spring, он пытается преобразовать мою переменную типа String в переменную типа Long, когда она должна просто оставаться типом String.Я подозреваю, что единственное, что он пытается сделать - это заполнить переменную Id.

Не удалось преобразовать значение типа 'java.lang.String' в требуемый тип 'javaSpring.DojoOverflow.models.Questions';вложенным исключением является org.springframework.core.convert.ConversionFailedException: не удалось преобразовать тип [java.lang.String] в тип [java.lang.Long] для значения «Почему?»;вложенное исключение - java.lang.NumberFormatException: для входной строки: «почему?»

//---------------------------------------------------
// My Model
@Entity
@Table(name="questions")
public class Questions {
    // Attributes
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotEmpty(message = "Ask a question!")
    private String question;
    @Column(updatable=false)
    private Date createdAt;
    private Date updatedAt;
    @OneToMany(mappedBy="question", fetch = FetchType.LAZY)
    private List<Answer> answers;
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable (
       name="questions_tags",
       joinColumns = @JoinColumn(name="question_id"),
       inverseJoinColumns = @JoinColumn(name="tag_id")  
    )
    @Size (max=3)
    @NotEmpty(message="Tag your question!")
    private List<Tag> tags;

// ------------------------------------- 
// My Controller Mapping
@PostMapping("/questions/new")
public String processQuestion(@Valid @ModelAttribute("question")Questions   question, BindingResult result) {
    if(result.hasErrors()) {
        return "newQuestion.jsp";
    }
    questionService.createQuestion(question);
    return "redirect:/";
}

//-----------------------------------------------
// My jsp
<body>
<div class="container">
<h1>What is your question?</h1>
<form:form action="/questions/new" method="post" modelAttribute="question">
    <div class="form-group">        
        <form:label path="question">Question</form:label>
        <form:textarea rows="5" class="question form-control" path="question"/>
        <span class="error"><form:errors path="question"/></span>
    </div>
    <div class="form-group">        
        <form:label path="tags">Tags</form:label>
        <form:input class="tags form-control" placeholder="Tags"   path="tags"/>
        <span class="error"><form:errors path="tags"/></span>
    </div>
    <button class="btn btn-secondary" type="submit">Submit</button>
</form:form>
<a href="/questions">Go Back</a>
</div>
</body> 

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Я предлагаю применить шаблон MVVC, чтобы отделить ваш бизнес-объект от вашего объекта просмотра.

Вы ожидаете получить только строки из представления в объекте атрибута модели.

Ваш объект сущности содержит список тегов и список ответов => они смоделированы по-разному, и использование одного и того же класса является сложным, со многими потенциальными ошибками.

В вашем случае этоЛучше создать отдельный класс представления только со строками и преобразовать их в объект сущности.

Пример:

public class QuestionModelAttribute {
       private String tags;
       private String answers;
       .....
 }

, и ваш метод получит:

@PostMapping("/questions/new")
public String processQuestion(@Valid @ModelAttribute("question") QuestionModelAttribute questionModelAttribute, BindingResult result) {
   Questions question = questionsService.convertQuestion(questionModelAttribute);
   questionService.save(question);
   ..
}

Ваше представление получит в модели атрибут QuestionModelAttribute

<form:form action="/questions/new" method="post" modelAttribute="questionModelAttribute">

. Этот шаблон обеспечивает здоровую связь между представлением и моделью.

0 голосов
/ 14 октября 2018

выглядит как не полностью инициализированный объект.Проверьте свой метод обслуживания createQuestion и убедитесь, что каждое обязательное поле для Вопроса установлено до , и вы передаете его в контроллер.Эта форма не имеет всех необходимых полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...