Jsf 在setter中添加额外的逻辑?

Jsf 在setter中添加额外的逻辑?,jsf,setter,business-logic,Jsf,Setter,Business Logic,我有一个jsf视图,如下所示: <h:selectOneMenu value="#{myBean.selectedRoleId}"> <f:selectItems value="#{myBean.roles}" /> <a4j:ajax event="change" listener="#{myBean.roleChanged}" render="roleFeatures" /> </h:sele

我有一个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;
    }

}
公共类MyBean{
私人角色选择角色;
私有整数selectedRoleId;
私有列表角色选择项;
私人角色服务角色服务;
//准备
公共列表getRoles(){
initRoles();
返回角色选择项;
}
私有void initRoles(){
roles=newhashmap();
RoleSelectItems=新建LinkedList();
//做一些数据库操作
}
public void setSelectedRoleId(整数selectedRoleId){
selectedRole=roleService.getBy(selectedRoleId);//我们现在开始
//按数据库中的Id显示的实际角色
this.selectedRoleId=selectedRoleId;
}
}

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

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

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

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

@Tiny我听说
@PostConstruct
不是一个好的注释。我们应该避免使用它吗?@Tiny顺便说一句,据我所知,注释仅在JSF2.0之后才可用。但是我们仍然有一些关于JSF1.2的项目。如果角色是JPA实体对象,那么最好使用@Postload@user3694267是的。但我们使用的是Hibernate 3.5,据我所知,该版本中没有注释……实际上,
roleService.getBy
调用Dao方法。一个fat-1没有提到针对特定问题的正确JSF方法,OP实际上正在试图解决,从而误导OP和未来的读者寻找解决同样问题的方法。