使用条目集时值无效

Value is not valid using entryset

当我尝试使用 LinkedHashMap 保存数据库中的条目时出现了这个问题。我不知道 xhtml 代码在多大程度上起作用,但从表面上看还不错。

问题出在 xhtml 的这一部分:

    <tbody>
        <tr>
            <td>Movie:</td>

            <!--td>
                <h:selectOneMenu id="foundmovieid" value="#{webRental.idmovie}">
                    <f:selectItems id="movieid" value="#{webMovie.get_all_movies()}"></f:selectItems>
                </h:selectOneMenu>
            </td-->

            <td>
                <h:selectOneMenu value="#{webRental.idmovie}">
                    <f:selectItems value="#{webMovie.availableMovies.entrySet()}" var="entry"
                                   itemValue="#{entry.key}" itemLabel="#{entry.value}" />
                </h:selectOneMenu>
            </td>

        </tr>
    </tbody>
</table>
<h:commandButton value="Submit" action="#{webRental.save()}"></h:commandButton>

这是WebRental.java:

public class WebRental {

    @EJB
    private RentalsFacade rf;

    private String iduser;
    private String idmovie;

    //getters and setters

    public List<Rentals> get_all_rents() {
        return rf.findAll();
    }

    public void save() {
        try {
            rf.Save(iduser, idmovie);
        } catch (Exception e) {
        }
    }
}

和WebMovie.java,其 MoviesFacade 有一个 EntityManager 和一种持久化新 pbject 电影(id、标题、导演姓名和长度)的方法:

@Named
@RequestScoped
public class WebMovie {

    @EJB
    private MoviesFacade mf;

    private String id;
    private String title;
    private String director;
    private int length;

    private Map<String, String> availableMovies;

    //geters and setters

    public List<Movies> get_all_movies() {

        availableMovies = new LinkedHashMap<>();
        List<Movies> found = mf.findAll();

        found.forEach((m) -> {
            String first = m.getId();
            String second = m.getTitle() + ", " + m.getDirector() + ", " + m.getLength() + " minutes.";
            availableMovies.put(first,second);
        });

        return mf.findAll();
    }

    public void save() {
        try {
            mf.Save(id, title, director, length);
        } catch (Exception e) {
        }
    }
}

在 xhtml 中,有一个静音部分,这正是我必须做的(获取 ID 并提交它们),但是您只能看到 ID。未静音部分是我遇到问题的部分,因为它表示该值无效。

要解决这个问题,我必须使用 "converters" 吗?如果是这样,我该如何实施?如果不是,我的错误是什么?

此外,在静音部分有对 "get_all_movies()" 的调用,但由于它已静音,因此不应调用。我如何在该静音部分之外调用该函数,以便在我使用地图工作的 SelectOneMenu 后删除整个部分?

原来使用地图很奇怪... 我是如何解决这个问题的,方法是删除大部分 SelectItems,这样它就是:

<f:selectItems value="#{webMovie.availableMovies}" />

然后改变我将所有内容插入地图的方式,如下所示:

@PostConstruct
public void init() {
    availableMovies = new HashMap<>();

    mf.findAll().forEach((m) -> {
        availableMovies.put((String) m.getTitle() + ", " + m.getDirector() + ", " + m.getLength() + " minutes.",(String) m.getId());
    });
    //Turns out that, for the selectItems to read properly the map, you have to insert the text you want to be displayed as the key, and then the value as value. I was doing it backwards.
}

这样我就不必依赖调用 get_all_movies() 的 !--' 部分,我可以删除它!