【问题标题】:Adding additional piece of logic into setters?在设置器中添加额外的逻辑?
【发布时间】:2015-04-14 10:22:28
【问题描述】:

我对jsf的看法如下:

<h:selectOneMenu value="#{myBean.selectedRoleId}">
    <f:selectItems value="#{myBean.roles}" />
    <a4j:ajax event="change" listener="#{myBean.roleChanged}"
                     render="roleFeatures" />
</h:selectOneMenu>

还有 bean 本身:

public class MyBean{
    private Role selectedRole;
    private Integer selectedRoleId;
    private List<SelectItem> rolesSelectItems;
    private RoleService roleService;
    //GET,SET

    public List<SelectItem> getRoles() {
        initRoles();

        return rolesSelectItems;
    }

    private void initRoles() {
        roles = new HashMap<Integer, Role>();
        rolesSelectItems = new LinkedList<SelectItem>();
        //Do some DB operations     
    }

    public void setSelectedRoleId(Integer selectedRoleId) {
        selectedRole = roleService.getBy(selectedRoleId); //Here we are getting 
                                    //actual role by its Id from database
        this.selectedRoleId = selectedRoleId;
    }

}

在 setter 中执行额外的逻辑是否被认为可以?在我的特殊情况下,当用户使用selectOneMenu 选择另一个Role 时,我从数据库中得到了实际的Role-entity。对我来说,setter 是一种只执行设置特定对象的方法,不再执行。这就是我问这个问题的原因。

【问题讨论】:

  • @Tiny 我在某处听说@PostConstruct 不是一个很好的注释。我们应该避免使用它吗?
  • @Tiny BTW,据我所知,注释仅在 JSF 2.0 之后才可用。但是我们还有一些关于 JSF 1.2 的项目。
  • 如果Role是JPA实体对象,最好使用@Postload
  • @user3694267 是的。但是我们使用的是 Hibernate 3.5,据我所知,该版本中没有注释....

标签: jsf setter business-logic


【解决方案1】:

对我来说,向 setter 添加额外的代码是可以的。例如,如果您知道字符串不能为空,您可以执行以下操作:

public void setMe(String me) {
    if (me == null) {
        this.me = "";
    } else {
        this.me = me;
    }
}

但是在 setter 中添加对数据库的调用是不正确的。这应该在调用 dao 的服务中完成。

【讨论】:

  • 嗯,其实roleService.getBy调用的是Dao方法。
  • 一个胖 -1 没有提到针对特定问题的正确 JSF 方法 OP 实际上 试图解决,从而误导 OP 和未来的读者寻找解决方案同样的问题。
猜你喜欢
  • 2014-08-11
  • 1970-01-01
  • 2016-10-28
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多