首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring JPAFailed将值从[java.lang.String]类型转换为[java.lang.Long]类型。

Spring JPAFailed将值从[java.lang.String]类型转换为[java.lang.Long]类型。
EN

Stack Overflow用户
提问于 2018-10-14 03:47:46
回答 2查看 2.8K关注 0票数 1

我不明白为什么当我试图在spring中使用modelAttributed表单时,它却试图将我的String类型变量转换为Long类型变量,而实际上它只应该是一个String类型。我怀疑它唯一要做的就是填充Id变量。

无法将类型为' java.lang.String‘的值转换为必需的值,嵌套异常是org.springframework.core.convert.ConversionFailedException:无法将值’java.lang.String?‘从类型java.lang.String转换为类型java.lang.Long;嵌套异常为java.lang.NumberFormatException:对于输入字符串:“为什么?”

代码语言:javascript
复制
//---------------------------------------------------
// 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> 
EN

回答 2

Stack Overflow用户

发布于 2018-10-14 05:20:09

看起来像是一个未完全初始化的对象。检查您的createQuestion服务方法,并确保在将问题传递给控制器之前设置了问题的每个必填字段。该表单本身并不包含所有必需的字段。

票数 1
EN

Stack Overflow用户

发布于 2018-10-14 06:48:19

我建议使用MVVC模式来分离您的业务对象和视图对象。

在您的情况下,最好创建一个仅包含字符串的单独视图类,并将其转换为实体对象。

示例:

代码语言:javascript
复制
public class QuestionModelAttribute {
       private String tags;
       private String answers;
       .....
 }

你的方法将接收到:

代码语言:javascript
复制
@PostMapping("/questions/new")
public String processQuestion(@Valid @ModelAttribute("question") QuestionModelAttribute questionModelAttribute, BindingResult result) {
   Questions question = questionsService.convertQuestion(questionModelAttribute);
   questionService.save(question);
   ..
}

您的视图将在模型中接收一个QuestionModelAttribute

代码语言:javascript
复制
<form:form action="/questions/new" method="post" modelAttribute="questionModelAttribute">

此模式在视图和模型之间提供了健康的解耦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52796722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档