首页 文章

Spring JPAFailed将类型[java.lang.String]转换为类型[java.lang.Long]以获取值'Why?'

提问于
浏览
0

我不明白为什么当我尝试在spring中使用modelAttributed表单时,它试图将我的String类型变量转换为Long类型变量,因为它应该只是一个String类型 . 我怀疑它试图做的只是填充Id变量 .

无法将'java.lang.String'类型的值转换为必需类型'javaSpring.DojoOverflow.models.Questions';嵌套异常是org.springframework.core.convert.ConversionFailedException:无法从类型[java.lang.String]转换为类型为'Why?'的类型[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

    看起来像一个未完全初始化的对象 . 检查您的createQuestion服务方法,并确保在将问题传递给控制器之前设置了Question的每个必填字段 . 仅这种形式没有所有必要的领域 .

  • 0

    我建议应用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">
    

    这种模式提供了视图和模型之间的 Health 解耦 .

相关问题