1

私はSpringMVCを使用してWebを作成していますが、まだSpringの初心者です。私には多対多の関係を持つ2つのエンティティがあります。実際には、私はUserGroupを持っています。これには、複数または1つ(またはまったく)のUserAuthorityを含めることができます。複数選択のフォームを使用してこれらの関係を編集します。新しいUserGroupエンティティの作成または既存のエンティティの編集は正常に機能しますが、小さな問題が1つあります。既存のUserGroupを編集するときに、選択ボックスに適切な権限が選択されていません。私はこれに1日以上取り組んできましたが、成功しませんでした。誰か助けてくれませんか?

エンティティの私のモデルは次のとおりです。

@Entity
public class UserGroup {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
        name = "user_group_has_user_authority",
        joinColumns = {
            @JoinColumn(name = "user_group_id")},
        inverseJoinColumns = {
            @JoinColumn(name = "user_authority_id")})
    private Set<UserAuthority> authorities;
}

(私はゲッターとセッターを省略しましたが、コードにそれらが含まれています)

public class UserAuthority {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;

    private String code;

    private String name;
}

(繰り返しますが、私はセッターとゲッターを省略しました)。

私のフォームは次のようになります。

<form:form action="${action}" method="post" commandName="userGroup" id="user-group-form">
    <form:input readonly="true" cssClass="dn" path="id"/>
    <table>
        <tr>
            <td>
                <form:label path="title">Title</form:label>
                <form:errors path="title" />
            </td>
            <td>
                <form:input path="title"/>
            </td>
        </tr>
        <tr>
            <td>
                <form:label path="authorities">Authorities</form:label>
                <form:errors path="authorities" />    
            </td>
            <td>
                <form:select path="authorities" multiple="true" items="${authoritiesList}" />
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="Save" />
            </td>
        </tr>
    </table>
</form:form>

私のコントローラーの方法は次のとおりです。

@RequestMapping(value = "/editGroup", method = RequestMethod.GET) 
public ModelAndView editGroup(Model model, HttpServletRequest request) {
    Long id = null;
    UserGroup userGroup = null;
    HashMap<String, Object> editModel = new HashMap<>(2);

    try {
        id = Long.parseLong(request.getParameter("id"));
    } catch (NumberFormatException ex) {
    }
    if (id != null) {
        userGroup = groupsManager.get(id);
    } 

    UserGroupData userGroupData = groupsManager.createFromUserGroup(userGroup);

    editModel.put("userGroup", userGroupData);
    editModel.put("authoritiesList", getAuthoritiesList());

    return new ModelAndView("/users/groupEdit", editModel);
}

@RequestMapping(value = "/editGroup", method = RequestMethod.POST)
public String updateGroupAction(@ModelAttribute("userGroup") @Validated UserGroupData userGroupData, BindingResult result, Model model, HttpServletRequest request) {

    if (result.hasErrors()) {
        model.addAttribute("userGroup", userGroupData);
        return "/users/groupEdit";
    }
    groupsManager.saveUserGroupData(userGroupData);
    return "redirect:/users/listGroup";
}

private Map <Long, String> getAuthoritiesList() {      //I also tried returning Map<String,String> but result was same.
    Map<Long,String> authorities = new LinkedHashMap<>();
    for (UserAuthority ua : authorityManager.getAll()) {
        authorities.put(ua.getId(), ua.getName());
    }
    return authorities;
}

最後に、私はこのコンバーターを使用してStringからUserAuthorityを作成します(実際にはこれをどこかでグーグルで検索しましたが、機能します:))publicclassStringToUserAuthorityConverterはConverter{を実装します

    /**
     * The string that represents null.
     */
    private static final String NULL_REPRESENTATION = "null";

    @Autowired
    private UserAuthorityDao authorityDao;

    @Override
    public UserAuthority convert(final String id) {
        if (id.equals(NULL_REPRESENTATION)) {
            return null;
        }
        Long lId = null;
        try {
            lId = new Long(id);
        } catch (NumberFormatException e) {

        }
        return authorityDao.find(lId);
    }
}

私が言ったように、すべての作成と編集は機能しますが、私が抱えている唯一の問題は、既存のグループを編集するときに、グループにすでに関連付けられている権限が選択されないことです。どんな助けでも大歓迎です。

編集

私は2つのことを見つけました、多分それは助けることができます:

1)htmlページには、次のフィールドがあります。

<input type="hidden" value="1" name="_authorities">

権限フィールドフォームモデルの値が含まれている必要があると読みましたが、私の場合は常に1が含まれています

2)フォームの検証に失敗した場合(つまり、必須のタイトルを入力しない場合)、フォームはエラーメッセージとともに再読み込みされますが、選択ボックスは空です。それは何かのしるしではありませんか?

編集2

前回の編集からポイント2)を解決しました...

4

3 に答える 3

2

エンティティクラスequals()hashCode()メソッドを実装する必要があります。Authorityこれは、Set(および他のコレクションが)オブジェクトの同等性をチェックするためであり、これが、Springがすでに選択されているフィールドをマークする方法です。

http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/persistent-classes.html#persistent-classes-equalshashcode

于 2013-10-08T19:48:56.327 に答える
1

だから私は1つの醜い解決策を作りました。それは機能しますが、コードは私が望むほど良くはありません。jspでフォームを次のように編集しました。

<form:select path="authorities" multiple="true" >
     <c:forEach var="authority" items="${authoritiesList}">
         <c:choose>
             <c:when test="${userGroup.authorities.contains(authority) eq true}">
                 <option value="${authority.id}" selected="selected">${authority.name}</option>
             </c:when>
             <c:otherwise>
                 <option value="${authority.id}">${authority.name}</option>
             </c:otherwise>
        </c:choose>
    </c:forEach>
</form:select>

しかし、もっと良い方法が必要です...

于 2012-10-29T09:39:40.003 に答える
0

変換にはAutoPopulatingListを使用する必要があります。この機能は、リストデータをモデルリストに変換するために春に利用可能になります。

于 2012-10-26T09:55:54.670 に答える