我不明白为什么当我尝试在spring中使用modelattributed表单时,它试图将我的字符串类型变量转换为长类型变量,而它应该保持为字符串类型。我唯一怀疑它要做的就是填充id变量。
未能将“java.lang.string”类型的值转换为所需类型“javaspring.dojooverflow.models.questions”;嵌套异常为org.springframework.core.convert.conversionfailedexception:未能将值“why”的类型[java.lang.string]转换为类型[java.lang.long];嵌套异常是java.lang.numberformatexception:对于输入字符串:“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>
<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条答案
按热度按时间uwopmtnx1#
看起来像一个未完全初始化的对象。检查createquestion服务方法,并确保在将问题传递给控制器之前设置了问题的每个必需字段。仅此表单并没有所有必需的字段。
xe55xuns2#
我建议应用mvvc模式来分离业务对象和视图对象。
您希望仅从模型属性对象中的视图接收字符串。
您的实体对象包含一个标签列表和一个答案列表=>它们的建模方式不同,很难使用同一个类,而且有许多潜在的bug。
在您的情况下,最好创建一个仅包含字符串的单独视图类,并将它们转换为实体对象。
例子:
您的方法将收到:
您的视图将在模型中收到questionmodelattribute
这种模式在视图和模型之间提供了一种健康的解耦。