当前位置: 首页 > 知识库问答 >
问题:

Spring Forms绑定异常-IllegalStateException:无法将类型[java.lang.String]的值转换为所需类型

陶富
2023-03-14

我是Spring和Java的新手,正在使用JSP、JSTL、Hibernate/JPA和一个model类使表单在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,而User对象期望传递一个Role对象。但是,我不确定如何解决这一问题,同时仍然允许我的JSP由我的实际实体对象支持,因为我希望使用Spring/Hibernate验证。是否只有一种方法来声明表单:select作为一个角色对象?任何建议或解决方案都非常感谢。先谢谢你。

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

用户控制器

/**
 * 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 + "]";
    }
}
<%@ 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>

共有1个答案

钦耀
2023-03-14

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

这是我的课。

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>
 类似资料:
  • 这是控制器代码部分: 我收到这条消息: 出现错误(类型=错误请求,状态=400)。无法将类型[java.lang.String]的值转换为所需类型[java.util.Date];嵌套异常为org.springframework.core.convert.conversionfailedexception:无法将值“Wed Jun 08 00:00:00 WET 2016”从类型[java.lan

  • 我有两个实体,它们使用一个主键互相引用,主键是一个实体的整数。我不确定我做这件事的方式是否正确。 下面是引用主键id为int的实体 下面是我们从上面的实体中将外键设置为Kmichango kandaMchango的实体。 这里是表单的一部分,我在这里提交了用户在jumuiya_michango_form.html中提供的数据 下面是我的控制器中用于链接到表单和发布数据的两个方法 在我提交表单后,我

  • 我在尝试按照firebase数据库的文档将数据检索到要使用的对象时,遇到了一个错误。 这是我的对象模型 最后,代码 这是我在Firebase中的数据库结构。 来自 logcat 的完整 Stacktrace 就在这里。

  • 我正在关注Spring in Action 5,在按下提交按钮后创建Taco模型时遇到问题。这是我的设计Taco控制器类: 以及我捕获的错误消息: 炸玉米饼实体如下所示: 以及我的配料实体: 这是一个html页面,必须使用所选成分创建新的Taco对象: 我该怎么修理它?谢谢你的预付款。

  • 我正试图通过提供JSON格式的所需请求来使用postman来访问一个服务: 邮递员屏幕 但我得到了一个错误: “无法将类型”java.lang.String“的值转换为所需的类型”SampleRequestObject“;嵌套异常为java.lang.IllegalStateException:无法将类型[java.lang.String]的值转换为所需类型“ 控制器 SampleRequestO

  • 我是Spring MVC的新手,试图构建一个示例应用程序,我试图将数据保存到一个名为EmployeeDetails的表中,该表与表用户有一对一的关系。提交表单后,我在字段“user”的对象“employee details”中得到了这个错误字段:rejected value[Users];代码[typemismatch.employeeDetails.user,typemismatch.user,