java - 代码分区的好习惯

标签 java jsf ejb

示例我有一个 JSF 托管 bean,并且我有创建用户的方法:

 public String createNewAccount() {
        FacesContext context = FacesContext.getCurrentInstance();
        Map requestParameterMap = (Map) context.getExternalContext().getRequestParameterMap();
        try {
            String userRole = requestParameterMap.get("userRole").toString();
            String active = requestParameterMap.get("active").toString();
            Boolean act = Boolean.parseBoolean(active);
            user.setRole(userRole);
            user.setActive(act);
            if ((user.getEmail() != null) && (userDao.findEmailExist(user.getEmail()))) {
                sendErrorMessageToUser("A user with the given email address exists in the databasee");
                return null;
            } else {
                userDao.create(user);
            }
        } catch (EJBException e) {
            sendErrorMessageToUser("Register error");
            return null;
        }
        return "newAccountCreated";
    }

我读到JSF ManagedBean应该只用于导航,这里我的问题是在JSF beanie中进行这样的验证是否正确?例如,我们是否应该创建一个服务层来完成验证?例如,像这样:

@Stateless
public class UserDao implements UserDaoLocal {

    @PersistenceContext
    private EntityManager em;
    private User user;

    @Override
    public void create(User user) {
        em.persist(user);
    }

@Stateless
public class UserDaoService implements UserDaoServiceLocal {

    @EJB
    private UserDaoLocal userDao
    private User user;


    @Override
    public String create(User user) {
        if(findEmailExist(user.email) {
            return "emailExist";
        } else {
             userDao.create(user);
              return "create";
       }
    }

    @Override
    public boolean findEmailExist(String email) {
        try {
            Query q = em.createNamedQuery("User.findByEmail");
            q.setParameter("email", email);
            user = (User) q.getSingleResult();
            return true;
        } catch (Exception e) {
            System.out.println("Błąd email: " + e.getMessage());
            return false;
        }
    }

然后在 jsf bean 中只有这个:

public String createNewAccount() {
        FacesContext context = FacesContext.getCurrentInstance();
        Map requestParameterMap = (Map) context.getExternalContext().getRequestParameterMap();
        try {
            String userRole = requestParameterMap.get("userRole").toString();
            String active = requestParameterMap.get("active").toString();
            Boolean act = Boolean.parseBoolean(active);
            user.setRole(userRole);
            user.setActive(act);
            String result userDaoService.create(user);
            if (result = "emailExist") {
                sendErrorMessageToUser("A user with the given email address exists in the database");
                return null;
            } else
                return result;
            }
        } catch (EJBException e) {
            sendErrorMessageToUser("Error registration");
            return null;
        }
    }

这很好吗? 在 Java EE 中划分代码的最佳方法是什么?

最佳答案

验证通常属于服务层,因为不需要将其绑定(bind)到特定的 View 实现。因此,在您的情况下,请尝试将其放入 EJB 中。

  • 如果您必须实现另一个应用程序,该应用程序要使用另一个 View 实现(例如 Swing),它也将从验证中受益。

  • 针对服务层编写测试通常更容易;这样您就可以测试验证而无需模拟 View 层。

  • 使用 JSF,如果您有两个使用不同托管 Bean 的用例,并且这两个用例都创建一个用户,那么您最终可能需要编写两次验证代码。

关于java - 代码分区的好习惯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18308073/

相关文章:

java - 尝试使用 CommandBox 启动服务器时出现 "GTK+ 2.x symbols detected."错误

jsf - 如何将默认值设置为 <h :selectOneMenu>

java - 如果 @Singleton bean 中有一个 @Stateless 字段会发生什么?

java - EJB 事务和 JAX-RS

java - 服务器不直接响应我的命令

Java 和谷歌 Protocol Buffer : How do I make the jar?

Keycloak - Uma 配置

html - h :selectOneMenu? 渲染的选择元素的默认大小是多少

javascript - 素面 : get geocoder address from google Map to ManagedBean

java - Wildfly 16.0.0.Final 和 ejb-client 与安全领域的连接