gpt4 book ai didi

java - Spring Forms 将异常 - IllegalStateException : Cannot convert value of type [java. lang.String] 绑定(bind)到所需类型

转载 作者:太空宇宙 更新时间:2023-11-04 06:59:20 29 4
gpt4 key购买 nike

我对 Spring 和 Java 比较陌生,正在努力使用 JSP、JSTL、Hibernate/JPA 和模型类来获取在 Spring MVC 中工作的表单。我可以让页面正常显示,但是应该创建用户的帖子给了我一个错误。

Failed to convert property value of type java.lang.String to required type com.everesttech.recruiting.searchtool.entity.Role for property user.role; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.everesttech.recruiting.searchtool.entity.Role] for property role: no matching editors or conversion strategy found

此错误是有道理的,因为表单正在传回角色的 ID,而用户对象期望传递角色对象。然而,我不确定如何解决这个问题,同时仍然允许我的 JSP 由我的实际实体对象支持,因为我想使用 Spring/Hibernate 验证。有没有一种方法可以将该 form:select 声明为 Role 对象?非常感谢任何建议或解决方案。提前致谢。

我已经提供了我的项目中的相关代码部分。我没有包含来自服务层和实体层的代码,因为我知道它们正在工作。不过,如果需要的话我也可以包括这些。用户与角色是多对一的关系。

用户 Controller

/**
* display the user add page
*
* @return returns the view name
*/
@RequestMapping(value="/user/add", method=RequestMethod.GET)
public ModelAndView showUserAdd(ServletRequest request, @ModelAttribute("userModel") UserModel userModel, ModelMap modelmap) {

ModelMap modelMap = new ModelMap();
userModel.setUser(new User());
userModel.setRoles(userService.getRoles());
modelMap.addAttribute("userModel", userModel);

return new ModelAndView("user/add", modelMap);
}

/**
* handle post request to handle user creation, if successful displays user list page
*
* @param user User object from JSP
* @param result BindingResult from JSP
* @return returns view name
*/
@RequestMapping(value="/user/add", method=RequestMethod.POST)
public String userAdd(UserModel userModel, BindingResult result) {

if (result.hasErrors()) {
logger.warn("Error binding UserModel for /user/add, returning to previous page");
List<ObjectError> errors = result.getAllErrors();
for (ObjectError error : errors) {
logger.warn(error.getCode() + " - " + error.getDefaultMessage());
}
return "user/add";
}

try {
User user = userModel.getUser();
userService.addUser(user);
}
catch (DuplicateKeyException e) {
logger.warn("Duplicate record found in User table", e);
}
catch (Exception e) {
logger.error("Error occurred while trying to create a new user", e);
}

return "/user";
}

这是我传递给 JSP 的模型,其中包含一个用户对象(即 Hibernate 实体)和一个角色列表(另一个 Hibernate 实体)。

import java.util.List;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.everesttech.recruiting.searchtool.entity.Role;
import com.everesttech.recruiting.searchtool.entity.User;

@Scope(value="request")
@Component("userModel")
public class UserModel {

public User user;
public List<Role> roles;

public UserModel() {

}

public UserModel(User user, List<Role> roles) {
this.user = user;
this.roles = roles;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

public List<Role> getRoles() {
return roles;
}

public void setRoles(List<Role> roles) {
this.roles = roles;
}

@Override
public String toString() {
return "UserModel [user=" + user + ", roles=" + roles + "]";
}
}

这是我的 JSP。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-8 col-md-6">
<h3>User - Add</h3>
<br>

<spring:hasBindErrors name="userModel">
<div class="alert alert-danger">
<sf:errors path="userModel.user.firstName"></sf:errors>
<sf:errors path="userModel.user.lastName"></sf:errors>
<sf:errors path="userModel.user.email"></sf:errors>
<sf:errors path="userModel.user.userName"></sf:errors>
<sf:errors path="userModel.user.password"></sf:errors>
<sf:errors path="userModel.user.role"></sf:errors>
</div>
</spring:hasBindErrors>

<c:url var="formAction" value="/user/add" />

<sf:form commandName="userModel" modelAttribute="userModel" method="post" action="${formAction}">
<div class="form-group">
<label for="first-name">First Name</label>
<sf:input path="user.firstName" id="first-name" class="form-control" placeholder="First Name" />
</div>
<div class="form-group">
<label for="last-name">Last Name</label>
<sf:input path="user.lastName" id="last-name" class="form-control" placeholder="Last Name" />
</div>
<div class="form-group">
<label for="email">Email</label>
<sf:input path="user.email" id="email" class="form-control" placeholder="Email" />
</div>
<div class="form-group">
<label for="user-name">Username</label>
<sf:input path="user.userName" id="user-name" class="form-control" placeholder="Username" />
</div>
<div class="form-group">
<label for="password">Password</label>
<sf:password path="user.password" id="password" class="form-control" placeholder="" />
</div>
<div class="form-group">
<label for="confirm-password">Confirm Password</label>
<input type="password" id="confirm-password" class="form-control" placeholder="" />
</div>
<div class="form-group">
<label for="role">Role</label>
<sf:select path="user.role" id="role" class="form-control" >
<c:forEach var="r" items="${userModel.roles}">
<sf:option value="${r.getId()}">${r.getFriendlyName()}</sf:option>
</c:forEach>
</sf:select>
</div>
<button type="submit" class="btn btn-default">Save</button>
<button type="button" class="btn btn-default">Cancel</button>
</sf:form>
</div>
</div>
</div>

最佳答案

对于任何感兴趣的人,我在 Spring 文档中找到了解决方案。我必须创建一个类来处理从字符串到角色的转换并注册它。这必须访问数据库来创建 Role 对象,但我没有看到其他处理它的方法。

这是我的类(class)。

import javax.inject.Inject;

import org.springframework.core.convert.converter.Converter;

import com.everesttech.recruiting.searchtool.dao.RoleDao;
import com.everesttech.recruiting.searchtool.entity.Role;

final class StringToRole implements Converter<String, Role> {

@Inject
RoleDao roleDao;

@Override
public Role convert(String source) {
return roleDao.find(Long.parseLong(source));
}
}

我在 mvc-context.xml 文件中添加/编辑了以下内容。

<!-- Enables the Spring MVC @Controller programming model -->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.examplecompany.exampleapp.example.converter.StringToRole"/>
</list>
</property>
</bean>

这有效,我现在可以毫无问题地提交表单。但是现在,当用户对象不满足验证要求时,我的 hibernate 验证不会出现在 JSP 上。例如,名字有一个 @NotBlank 注释。我可以看到正在检测到它并且我正在记录它。然而,它们没有以 form:error 标记的形式出现在 jsp 上。如果有人知道如何解决该问题,请告诉我。

关于java - Spring Forms 将异常 - IllegalStateException : Cannot convert value of type [java. lang.String] 绑定(bind)到所需类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22332452/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com