【问题标题】:Not able to persist the role mapped to the user无法保留映射到用户的角色
【发布时间】:2016-10-18 17:31:56
【问题描述】:

我正在使用 Spring 4 创建一个应用程序,Hibernate 4 具有 Spring 安全性

用户有分配给他们的角色,但是当我尝试创建用户时,它无法保存用户,它在角色字段下方的浏览器上给了我异常

Failed to convert property value of type [java.lang.String[]] to required type [java.util.Set] for property userRoles; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type 

[@org.hibernate.validator.constraints.NotEmpty @javax.persistence.ManyToMany @javax.persistence.JoinTable com.himanshu.blogger.model.Role] 值 2;嵌套异常是 java.lang.StackOverflowError

我的用户模型类

@Entity
@Table(name = "BLOG_USER")
public class User {

    @Id
    @Column(name = "USER_ID")
    private String userId;

    @NotEmpty
    @Column(name = "PASSWORD")
    private String password;

    @NotEmpty
    @Column(name = "FIRST_NAME")
    private String firstName;

    @NotEmpty
    @Column(name = "MIDDLE_NAME")
    private String middleName;

    @NotEmpty
    @Column(name = "LAST_NAME")
    private String lastName;

    @Column(name = "EMAIL")
    private String email;

    @Column(name = "PHONE")
    private String phone;

    @NotNull
    @Column(name = "STATE")
    private Integer state = State.ACTIVE.getState();

    @Transient
    private String stateName;

    @NotEmpty
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "USER_ROLE_MAP", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = {
            @JoinColumn(name = "ROLE_ID") })
    private Set<Role> userRoles = new HashSet<>();

/*skipped getter, setters and some utility methods*/

榜样课

@Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ROLE_ID")
    private Integer roleId;

    @Column(name="ROLE_TYPE", length=20, nullable=false, unique=true)
    private String roleType=RoleType.USER.getRoleType();
/*skipped getters and setters*/

我在这里注册新用户的控制器方法我添加了一个模型属性也可以在注册表单中加载角色

/**
     * This method will provide the medium to add a new user. 
     * By GET method it will identify that it has to load registration page
     */
    @RequestMapping(value = { "/newuser" }, method = RequestMethod.GET)
    public String newUser(ModelMap model) {
        User user = new User();
        model.addAttribute("user", user);
        model.addAttribute("edit", false);
        return "registration";
    }

    /**
     * This method will be called on form submission, handling POST request for
     * saving user in database. It also validates the user input
     */
    @RequestMapping(value = { "/newuser" }, method = RequestMethod.POST)
    public String saveUser(@Valid User user, BindingResult result, ModelMap model) {

            System.out.println("save user : "+user);
            if (result.hasErrors()) {
                return "registration";
            }

            if(!userService.isUniqueUser(user.getUserId())){
                FieldError userIdError =new FieldError("user","userId",messageSource.getMessage("non.unique.ssoId", new String[]{user.getUserId()}, Locale.getDefault()));
                result.addError(userIdError);
                return "registration";
            }

            userService.saveUser(user);

            model.addAttribute("success", "User " + user.getFirstName() + " "+ user.getLastName() + " registered successfully");

        //return "success";
        return "registrationsuccess";
    }

@ModelAttribute("blogRoleList")
    public List<Role> initializeProfiles() {
        return roleService.findAll();
    }

我已经注册了一个转换器来将角色 id 转换为角色对象

@Component
public class RoleIdtoRoleConverter implements Converter<Object, Role> {

    @Autowired
    RoleService roleService;

    public Role convert(Object roleIdObj) {

        System.out.println("covertor called with id " + roleIdObj.toString());
        Integer roleId = -1;
        try {
            roleId = Integer.parseInt((String) roleIdObj);
        } catch (NumberFormatException e) {
            throw new ConversionFailedException(TypeDescriptor.valueOf(String.class),
                    TypeDescriptor.valueOf(Role.class), roleIdObj, null);
        }

        System.out.println("covertor called with id " + roleIdObj.toString());

        Role role = roleService.findRoleById(roleId);
        System.out.println("Role = " + role);

        return role;
    }

在我的配置类中注册了这个转换器

@Autowired
    RoleIdtoRoleConverter roleIdToRoleConverter;

    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(roleIdToRoleConverter);
    }

注册JSP文件registration.jsp

<form:form method="POST" modelAttribute="user" class="form-horizontal">
<%--        <form:input type="hidden" path="userId" id="useId"/> --%>

        <div class="row">
            <div class="form-group col-md-12">
                <label class="col-md-3 control-lable" for="firstName">First Name</label>
                <div class="col-md-7">
                    <form:input type="text" path="firstName" id="firstName" class="form-control input-sm"/>
                    <div class="has-error">
                        <form:errors path="firstName" class="help-inline"/>
                    </div>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="form-group col-md-12">
                <label class="col-md-3 control-lable" for="lastName">Last Name</label>
                <div class="col-md-7">
                    <form:input type="text" path="lastName" id="lastName" class="form-control input-sm" />
                    <div class="has-error">
                        <form:errors path="lastName" class="help-inline"/>
                    </div>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="form-group col-md-12">
                <label class="col-md-3 control-lable" for="userId">User ID</label>
                <div class="col-md-7">
                    <c:choose>
                        <c:when test="${edit}">
                            <form:input type="text" path="userId" id="userId" class="form-control input-sm" disabled="true"/>
                        </c:when>
                        <c:otherwise>
                            <form:input type="text" path="userId" id="userId" class="form-control input-sm" />
                            <div class="has-error">
                                <form:errors path="userId" class="help-inline"/>
                            </div>
                        </c:otherwise>
                    </c:choose>
                </div>
            </div>
        </div>
        <c:if test="${!edit}">
            <div class="row">
                <div class="form-group col-md-12">
                    <label class="col-md-3 control-lable" for="password">Password</label>
                    <div class="col-md-7">
                        <form:input type="password" path="password" id="password" class="form-control input-sm" />
                        <div class="has-error">
                            <form:errors path="password" class="help-inline"/>
                        </div>
                    </div>
                </div>
            </div>
        </c:if>


        <div class="row">
            <div class="form-group col-md-12">
                <label class="col-md-3 control-lable" for="email">Email</label>
                <div class="col-md-7">
                    <form:input type="text" path="email" id="email" class="form-control input-sm" />
                    <div class="has-error">
                        <form:errors path="email" class="help-inline"/>
                    </div>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="form-group col-md-12">
                <label class="col-md-3 control-lable" for="userRoles">Roles</label>
                <div class="col-md-7">
                    <form:select path="userRoles" items="${blogRoleList}" multiple="true" itemValue="roleId" itemLabel="roleType" class="form-control input-sm" />
                    <div class="has-error">
                        <form:errors path="userRoles" class="help-inline"/>
                    </div>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="form-actions floatRight" style="margin-left: 25px">
                <c:choose>
                    <c:when test="${edit}">
                        <input type="submit" value="Update" class="btn btn-primary btn-sm"/> or <a href="<c:url value='/listUser' />">Cancel</a>
                    </c:when>
                    <c:otherwise>
                        <input type="submit" value="Register" class="btn btn-primary btn-sm"/> or <a href="<c:url value='/listUser' />">Cancel</a>
                    </c:otherwise>
                </c:choose>
            </div>
        </div>
    </form:form>

但我无法弄清楚它无法保存数据,我已经在控制器中打印了用户对象,它将角色显示为空白数组,我是否在这里遗漏了一些东西,无法获得,任何帮助并会得到建议。

为保存用户添加代码

抽象道类

public class AbstractDao <PK extends Serializable, T>{

    private final Class<T> persistantClass;

    @Autowired
    SessionFactory sessionFactory;

    @SuppressWarnings("unchecked")
    public AbstractDao() {
        this.persistantClass=(Class<T>)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];
    }

    public void persistEntity(T entity) {
        this.getSession().persist(entity);
    }
    /* mor emethods to load data on based on object type */
}

用户道实现类

@Repository("userDao")
public class UserDaoImpl extends AbstractDao<String, User> implements  UserDao{
    @Override
    public void saveUser(User user) {
        persistEntity(user);

    }
    /* more methods for fetching data from db*/
}

谢谢。

【问题讨论】:

  • stackoverflow.com/help/mcve... 请发布一个 MINIMAL 示例。您不应该转储整个代码,而应该发布重现问题所需的最少代码量。
  • 你认为如果我从中删除一些代码,问题就会有意义,它已经有我认为的非常精确的代码。
  • @HimanshuMishra 您的代码看起来不错。你如何持久化用户对象。您可以在此处添加该代码吗?
  • @Mustafa 添加了将用户保存在数据库中的代码
  • 我尝试使用您粘贴的代码重现您在 Spring Boot 项目中面临的错误,但我做不到,即上面的代码对我来说很好。如果你喜欢,你可以在这里file.io/kCgwpI 下载 Spring Boot 项目并尝试与你的比较。

标签: java spring hibernate jsp


【解决方案1】:

我的申请有问题。 问题出在从 DB 获取 role 对象的 dao 方法上, 在编写代码时错误地调用了相同的方法,该方法递归执行,因此转换器无法从 DB 中获取 role 对象。

【讨论】:

    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 2021-09-06
    • 2016-11-17
    • 2015-07-19
    • 2020-10-18
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多