为了账号安全,请及时绑定邮箱和手机立即绑定

Spring JPAF无法将类型 [java.lang.String] 转换为类型

Spring JPAF无法将类型 [java.lang.String] 转换为类型

陪伴而非守候 2021-11-17 10:21:57
我不明白为什么当我尝试在 spring 中使用 modelAttributed 表单时,它试图将我的 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: For input string: "Why?"//---------------------------------------------------// 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></form:form><a href="/questions">Go Back</a></div></body> 
查看完整描述

2 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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


查看完整回答
反对 回复 2021-11-17
?
慕斯709654

TA贡献1840条经验 获得超5个赞

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

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


查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 264 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信