如何在不同的JSF托管bean中重用表单控制器?

时间:2014-12-11 19:41:47

标签: jsf ejb

我目前有一个ViewScoped bean来管理实体的编辑。某些Entity的字段必然会有下拉列表,这些下拉列表会根据其他下拉选项而变化。我决定使用内部类来处理这些下拉,它的效果很好!

我想在其他bean中重用这个内部类,因为还有其他实体也可以使用这个下拉逻辑。我不知道建立这个的最好方法。以下是一些想法:

  • 如果我将这个下拉类作为自己的ViewScoped bean,那么我需要一种方法来使用正在使用它的实体来实例化它。使用它的原始ViewScoped Bean接收ID URL参数,并在数据库中查询post contstruct中的实体。如果我使用多个ViewScoped bean,那么我必须多次查询数据库,我不想这样做。
  • 我可以尝试将它变成普通的Java类,但后来我无法访问用于填充下拉列表的EJB。
  • 我可以把它变成一个抽象类,然后让每个使用它的托管bean实现pulldown population方法本身,但这看起来有点蠢。

这是我目前正在使用的模型:

@ViewScoped
public class EntityController {

    @EJB
    private EntityFacade entityFacade;
    @EJB
    private PulldownFacade pulldownFacade;

    private Entity entity;
    private PulldownController pulldownController;

    @PostContruct
    public void init() {
        entity = entityFacade.getEntity(param);
        pulldownController = new PulldownController();
    }

    public class PulldownController {


        public PulldownController() {               
        }

        public List<String> getPulldown() {
            List<String> list = facade.getPulldown();
            modifyThePulldownList(entity, list);
            return list;
        }
    }
}

<h:form>
    <h:selectOneMenu value=#{entityController.pulldownController.pulldown}/>
</h:form>

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为你应该做的是将getPulldown()逻辑封装在抽象类中实现的方法中。因此,每个后续实现都将使用此实现。这种方法将支持DRY和KISS原则。

在抽象类中通过@EJB访问EJB也没有问题,并且getPulldown()可以直接使用此字段,因为它在您的示例中使用它。