gpt4 book ai didi

jsf-2.2 - CDI ViewScope & PrettyFaces : Multiple calls to @PostConstruct (JSF 2. 2)

转载 作者:行者123 更新时间:2023-12-01 23:43:11 36 4
gpt4 key购买 nike

我已经检查了声明 JSF 2.1 有此错误的类似问题,但我使用的是 JSF 2.2 让我们详细说明:

我的环境:

  • CDI:1.1
  • 动态网络模块:3.0
  • Java:1.7
  • JSF:2.2
  • PrettyFaces:2.0.12.Final

我的 bean :

@Named(value = "home")
@javax.faces.view.ViewScoped
public class HomeBean implements Serializable {

@Inject
private HomeController controller;

private List<Store> myPopularStores;

@PostConstruct
public void postConstruct() {
myPopularStores = controller.getStores();
LOG.log(Level.FINE, "HomeBean: initialized");
}

public String buttonClicked() {
// whatever
}
}

那个 Controller ,现在只是一个返回单元素列表的模拟。

@Named
public class HomeController implements Serializable {
public List<Store> getStores() {
// mocked
}
}

我正在使用漂亮的面孔,pretty-config.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<pretty-config xmlns="http://ocpsoft.org/schema/rewrite-config-prettyfaces" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ocpsoft.org/schema/rewrite-config-prettyfaces
http://ocpsoft.org/xml/ns/prettyfaces/rewrite-config-prettyfaces.xsd">

<url-mapping id="Home">
<pattern value="/" />
<view-id value="/home.xhtml" />
</url-mapping>

<url-mapping id="cityIndex">
<pattern value="/#{provinceName}" />
<view-id value="/home.xhtml" />
</url-mapping>

</pretty-config>

home.xhtml 中,我将省略不相关的代码,但说我调用了 NhomeBean;例如 #{home.buttonClicked()}


好的;现在的问题。


每一个对 HomeBean 的引用,都会创建一个新的 HomeBean 实例;如果我在 @PostConstruct 处使用断点对其进行调试,它会被调用 N 次;所以 Controller 被调用了 N 次并且日志行 "HomeBean: initialized" 被打印了 N 次。

它是一个 @ViewScopped,所以我假设它在整个 View 中都处于事件状态,不是吗?

比方说,最终它正确地呈现了主页...但是 Controller 将成为数据库访问...我不希望每个图像都有新的数据库访问! O_O

[编辑]它肯定与 pretty-faces 相关,因为如果我删除它,它就可以正常工作。我在 web.xml

中配置了 Pretty faces,如下所示
<filter>
<filter-name>OCPsoft Rewrite Filter</filter-name>
<filter-class>org.ocpsoft.rewrite.servlet.RewriteFilter</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>OCPsoft Rewrite Filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ASYNC</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>

Pom 依赖项是(prettyfaces.version 是 2.0.12.Final):

<dependency>
<groupId>org.ocpsoft.rewrite</groupId>
<artifactId>rewrite-servlet</artifactId>
<version>${prettyfaces.version}</version>
</dependency>
<dependency>
<groupId>org.ocpsoft.rewrite</groupId>
<artifactId>rewrite-integration-faces</artifactId>
<version>${prettyfaces.version}</version>
</dependency>
<dependency>
<groupId>org.ocpsoft.rewrite</groupId>
<artifactId>rewrite-config-prettyfaces</artifactId>
<version>${prettyfaces.version}</version>
</dependency>

那里发生了什么?非常感谢。

最佳答案

问题是由这个映射引起的:

<url-mapping id="cityIndex">
<pattern value="/#{provinceName}" />
<view-id value="/home.xhtml" />
</url-mapping>

此映射基本上匹配每个以 / 开头的 URL。所以它不仅匹配/foobar,还匹配/style.css/scripts.js/jquery.min。 js 等等。

基本上有两种方法可以解决这个问题。首先,您可以尝试使用 custom regular expression限制路径参数允许包含的内容。例如,您可以使用这样的东西:

<url-mapping id="cityIndex">
<pattern value="/#{ /[a-z]+/ provinceName }" />
<view-id value="/home.xhtml" />
</url-mapping>

这告诉 PrettyFaces 省名只能包含字母,不能包含数字、句点等。这类似于 style.css 将不再匹配。

第二种选择是使用某种 URL 前缀,如下所示:

<url-mapping id="cityIndex">
<pattern value="/province/#{provinceName}" />
<view-id value="/home.xhtml" />
</url-mapping>

这是我通常推荐的方法,因为它是最简单直接的方法。 :)

关于jsf-2.2 - CDI ViewScope & PrettyFaces : Multiple calls to @PostConstruct (JSF 2. 2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30378962/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com