在setter中添加额外的逻辑?

时间:2015-04-14 10:22:29

标签: 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: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中执行额外的逻辑是否可以?在我的特定情况下,当用户选择另一个Role Role时,我从数据库中获得了实际selectOneMenu - 实体。对我来说,setter是一种只执行特定对象设置的方法,而不再是。这就是我提出这个问题的原因。

1 个答案:

答案 0 :(得分:0)

对我来说,可以在setter中添加其他代码。例如,如果您知道字符串不能为空,则可以执行以下操作:

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

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