Java EE - podział kodu.

0

Witam. Mam pytanie dotyczące tego co umieścić w poszczególnych częściach kodu:

Przykładowo mam managed beana JSF a w nim metodę do nawigacji wywołującą metodę tworzącą użytkownika:

    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("Użytkownik z podanym adresem email istnieje w bazie");
                return null;
            } else {
                userDao.create(user);
            }
        } catch (EJBException e) {
            sendErrorMessageToUser("Błąd rejestracji");
            return null;
        }
        return "newAccountCreated";
    }

Wyczytałem, że managed beany JSF powinny być tylko pośrednikiem między kodem java a stroną i tutaj moje pytanie czy takie robienie weryfikacji poprawności w beanie JSF jest poprawne? Czy należałoby utworzyć np. warstwę serwisową, w które taka weryfikacja się dokona? Np. coś takiego:

@Stateless
public class UserDao implements UserDaoLocal {

    @PersistenceContext
    private EntityManager em;
    private User user;

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

i do tego warstwę serwisową np. coś takiego:

@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;
        }
    }

i wtedy w beanie jsf tylko coś takiego:

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("Użytkownik z podanym adresem email istnieje w bazie");
                return null;
            } else
                return result;
            }
        } catch (EJBException e) {
            sendErrorMessageToUser("Błąd rejestracji");
            return null;
        }
    }
1

Moim zdaniem cały czas jest nieteges. Bean powinien być tylko kontenerem na dane i one powinny być do niego ładowane normalnie, do konkretnych pól beana, a nie jakimś chorym sposobem wyciągane z kontekstu. Poza tym cała logika powinna wykonywać się po stronie serwisu.

0

Ciężko znaleźć coś w necie na ten temat, jak już są przykłady to jakieś proste CRUDy.

Ale jak mam nie pobierać parametrów z mapy? Mam różne strony, na których można dodać admina, zwykłego użytkownika, konto nieaktywne itp. Coś takiego, akurat to jest rejestracja powyższa metoda też jest do niej.

                            <p:commandButton value="Rejestruj" action="#{userMB.createNewAccount()}" ajax="false" actionListener="#{captchaMB.submit}">
                                <f:param name="userRole" value="patient" />
                                <f:param name="active" value="false" />
                            </p:commandButton>

Powyższa metoda akurat jest do rejestracji, więc jest wspólna, ale np mam jedną metodę do tworzenia konta i w przesyłanych parametrach na stronie jest ustawiany typ konta.
Jak to inaczej miałbym rozwiązać?

Niby po co są w takim razie te parametry do metod? Czy nie służą do takich celów?

1

Dobra, dopiero teraz zauważyłem że pokazałeś tutaj tylko wycinek swojego kodu i wywaliłeś sporo istotnych fragmentów...
Czemu parametrów role i active nie przekazujesz do userBean tak samo jak całej reszty (tylko za pomocą ukrytego pola)?
Tak czy siak moim zdaniem cała logika z tego managed beana powinna polecieć do serwisu, a tam powinno zostać tylko samo wywołanie metody serwisowej.

0

Po co mam to przekazywać jawnie? Mam panel admina, administrator ma możliwość dodać 4 typy użytkowników: admin, użytkownik, użytkownikX, użytkownikY. W tabeli w bazie danych mam pole role, które określa typ danego konta. W panelu admina są 4 strony, każda do dodawania poszczególnych typów użytkowników. Jak admin klika dodaj użytkownika to po co ma mu ustawiać jeszcze na stronie, że konto ma być typu użytkownik? Domyślnie jest to przesyłane w parametrze. Tak wydaje mi się logiczniej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1