如何一次声明多个 JSF 管理的 bean



我正在开发一个使用基于 SOAP 的 Web 服务的 JSF 2.0 应用程序。

我想在 JSF 页面中使用大多数为 Web 服务生成的客户端类 - 但客户端类不是托管的 bean(也不是 CDI bean(...由于有很多客户端类,我认为向所有类添加@ManagedBean@Named注释是不可行的......

让我举个例子,这样事情可能会变得更清楚一些:

User 类是生成的客户端类 - 此类只有两个属性(登录名和密码(。

我希望能够在 JSF 页面中为给定用户的属性赋值:

<h:inputText value="#{user.name}"/>
<h:inputText value="#{user.password}"/>

然后我想调用我的UserService来验证用户:

<h:commandButton value="Login" action="#{userService.authenticate}"/>

从 JSF 页将值分配给用户对象的唯一方法 (AFAIK( 是使用户对象成为受管 Bean(或 CDI Bean(。

由于有 100 多个客户端类,我绝对不想在所有类上添加@ManagedBean@Named注释(我同样不想在 faces-config.xml 中的每个类添加 message-bean 元素(。

即使注释所有类是一个可行的选择,该解决方案也有一个缺点:服务契约 (WSDL( 可能随时更改,我有义务重新生成客户端类......我会丢失带注释的类。

处理这种(某种(问题的最佳方法是什么?

我一直在寻找一种方法来声明 faces-config 中包的所有类.xml(下面的示例(,但我既找不到这样做的方法,也找不到可行的替代方案。

<managed-beans>
    <managed-beans-package>x.y.z.ws.client</managed-beans-package>
    <managed-beans-scope>none</managed-beans-scope>
</managed-beans>

只需将User作为UserService的属性即可。这也更符合JSF的MVC意识形态。UserService是控制器,User是模型。

因此,

@ManagedBean
@ViewScoped
public class UserService {
    private User user;
    // ... (don't forget to prepare user in (post)constructor if "new" user)
}

<h:inputText value="#{userService.user.name}" />
<h:inputText value="#{userService.user.password}" />

最新更新