2016-10-18 8 views
-1

にマッピングされた役割を持続することができません、4持つ春のセキュリティを休止私は春の4を使用してアプリケーションを作成していたユーザ

ユーザーが各自に割り当てられた役割を持っていますが、私はそれができない、ユーザーを作成しようとしたとき、それは[@ org.hibernate.validator.constraints.NotEmpty @ javax.persistence.ManyToMany @ javax.persistence.JoinTable com.himanshu役割

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 

のフィールドの下にブラウザ上で私に例外を与えているユーザーを保存します。 blogger.model.Role]を値2に設定します。ネストされた例外は、私がロードするためにも、モデルの属性を追加したjava.lang.StackOverflowErrorを

マイUserモデルクラス

@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(); 
    } 

私はregisteを持っています私のconfigクラスでこのコンバータを登録Roleオブジェクト

@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> 

にロールIDを変換するコンバータを赤しかし、数字にはできませんよそれはデータを保存することができません、私はそれがロールバック空の配列として表示されているコントローラで、ユーザーオブジェクトを印刷した、私はここでいくつかのものを逃していない、任意のヘルプとsuggestio nsが得られるでしょう。ユーザー

抽象DAOクラスに

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 */ 
} 

ユーザーダオimplimentationのcalss

@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*/ 
} 

感謝を保存するためのコードの追加

+0

http://stackoverflow.com/help/mcve ... MINIMALの例を投稿してください。コード全体をダンプする必要はありません。問題を再現するために必要な最小のコードを投稿する必要があります。 – nhouser9

+0

私はこれからいくつかのコードを削除すると、質問が意味をなさないと思います、それは私が思うように既に非常に正確なコードを持っています。 –

+0

@HimanshuMishraコードが正常に見えます。あなたはどのようにユーザーオブジェクトを永続化していますか?ここにそのコードを追加できますか? – Mustafa

答えて

0

私のアプリケーションで問題が発生しました。 問題は、DBからroleオブジェクトを取得するためにそこにあったDAOメソッドであったのですが、コードを書くときに間違って を実行しました。同じメソッドへの呼び出しを再帰的に実行しましたので、convertorはDBからroleオブジェクト。

関連する問題