列表中的jsf requestscope

时间:2017-04-23 19:57:50

标签: jsf java-ee wildfly

我在JSF中有一个简单的表单,我想在ArrayList中添加与此表单关联的bean。

这是我的表格:

    <h:form styleClass="form-horizontal">
      <div class="row bottom-offset-20">
        <div class="col-sm-4">
            <div>
                <h:outputLabel for="pseudo">pseudo</h:outputLabel>
            </div>
            <div>
                <h:inputText id="pseudo" styleClass="form-control input-lg" value="${storyController.story.author}"/>
            </div>
        </div>
    <div class="row">
        <div class="col-sm-12">
            <h:commandButton action="#{storyController.save}" styleClass="btn btn-primary btn-lg" value="send.story.button"/>
        </div>
    </div>
</h:form>

我的控制器:

@Named
@RequestScoped
public class StoryController implements Serializable {

    private DefaultStoryService defaultStoryService;

    @Inject
    private Story story;

    @Inject
    public StoryController(DefaultStoryService defaultStoryService) {
        this.defaultStoryService = defaultStoryService;
    }

    public String save() {
        defaultStoryService.save(story);

        return "index.xhtml";
    }

    public void setStory(Story story) {
        this.story = story;
    }

    public Story getStory() {
        return story;
    }
}

服务:

@Named
@RequestScoped
public class DefaultStoryService {

    @Inject
    StoryMock mock;

    public void save(Story story) {
        mock.addStory(story);
    }
}

ArrayList:

@Named
@SessionScoped
public class StoryMock implements Serializable {

    private List<Story> stories;

    @PostConstruct
    public void setupData() {
        stories = new ArrayList<>();
    }

    public List<Story> getStories() {
        return stories;
    }

    public void setStories(List<Story> stories) {
        this.stories = stories;
    }

    public void addStory(Story story) {
        stories.add(story);
    }

}

故事豆:

@Model
public class Story implements Serializable {

    private Long id;

    private String author;
}

我的问题是,当创建新故事并保存时,列表中的所有故事都会使用新值进行更新。

在我的调试器中,第一次调用时:

first call

第二个电话:

second call

这就像请求范围不起作用。 我不明白为什么bean不只是添加到列表中,而是替换之前添加的所有bean。

1 个答案:

答案 0 :(得分:0)

请在控制器中的postconstruct方法中创建并分配Story对象,不要使用@Inject注入它。