【问题标题】:How to inject Managed Sesson Bean into Entity? JSF-PrimeFaces如何将托管 Sesson Bean 注入实体? JSF-PrimeFaces
【发布时间】:2015-07-09 07:33:16
【问题描述】:

我想将托管会话 Bean 注入到 JSF 中的实体中。

我有一个要求,我需要根据用户在前端选择的区域设置显示不同的状态文本。 (国际化)对于一个状态 ID,我有 4 个状态文本,即 StatusText、StatusTextLang1、StatusTextLang2、StatusTextLang3。

为了支持此功能,我正在更改 StatusText 属性的 getter 方法。在这里,我想从 SessionBean 中获取语言环境。因为它是一个实体,所以我得到一个空 sessionBean。

@Entity
@Table(name="Projektstati")
public class Projektstati implements Serializable{

@ManagedProperty("#{sessionBean}")
private SessionBean sessionBean;
public void setSessionBean(SessionBean sessionBean){this.sessionBean = sessionBean;}

【问题讨论】:

  • 在我看来,您正在尝试使用实体中的代码解决视图问题——这是非常非常糟糕的设计。为什么不向 SessionBean 本身添加一个方法来获取正确的文本?
  • 同意你的观点,问题是如果我这样做,我最终会做出巨大的改变。我有 11 个这样的实体和大约 60 个使用这些列的屏幕。还有什么可以解决的? @gimby
  • 你在这里没有向我描述问题。 11 个实体和 60 个屏幕什么都不是。
  • 好的,问题是我已经有 60 个页面在使用该字段的地方(直接在填充时)。现在,如果我要在 SessionBean 中进行更改,那么我将不得不在所有 60 个页面中进行更改。而如果我更新这个字段的 getter 方法的代码,所有的出现都会自动生效。我得到的唯一问题是我无法将 sessionBean 注入实体,因此我可以确定从前端选择了哪种语言。 @gimby

标签: jsf jsf-2 localization entity managed-property


【解决方案1】:

我检查了几个选项并解决了以下问题。

FacesContext facesContext = FacesContext.getCurrentInstance();
    sessionBean = (SessionBean) facesContext.getApplication()
        .getVariableResolver().resolveVariable(facesContext, "sessionBean");

这可能不是一个伟大的设计,但绝对是一个快速的解决方案。

【讨论】:

  • 这不仅不是很好(gr8 在 2010 年太棒了),而且它正在制作一个糟糕的解决方案(现有代码)甚至更糟......在你之后的其他人很可能看不到为什么这样做并诅咒你为它...只需花一天时间重构所有。它“只是”11 个实体和 60 个屏幕。
  • 正如 Kukeltje 所说,这是一个错误的决定……最好更改 11 个实体和 60 个屏幕,而不是创建错误的代码
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2011-06-11
  • 2014-07-01
  • 2012-01-27
  • 2012-02-22
  • 1970-01-01
  • 2013-02-10
  • 2015-03-11
相关资源
最近更新 更多