Какова хорошая структура проекта с JSF 2 и JPA 2? - PullRequest
1 голос
/ 02 ноября 2011

Моя идея такова: у меня есть bean-компонент ( UserBean ), у которого есть некоторые атрибуты, которые помогут мне проверить, прежде чем я установлю в сущность User . Я делаю это для повторного использования проверки в атрибуте UserBean во всем проекте и для разделения слоев, как я мог прочитать во многих постах здесь, в переполнении стека . Зная, что я хотел бы сохранить структуру MVC, давайте посмотрим, что я делаю до сих пор:

structure

(извините за большую картину, я подумал, что будет проще понять мой вопрос)

Это мой пользователь (в пакете сущностей):

@Entity
@Table(name="user")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    private int id;

    private String email;

    private String password;

    private int reputation;

    //bi-directional one-to-one association to Company
    @OneToOne(mappedBy="user", cascade={CascadeType.ALL})
    private Company company;

    //bi-directional many-to-one association to Location
    @OneToMany(mappedBy="user")
    private List<Location> locations;

    //bi-directional one-to-one association to Person
    @OneToOne(mappedBy="user")
    private Person person;

    //bi-directional many-to-one association to Product
    @OneToMany(mappedBy="user")
    private List<Product> products;

    //bi-directional many-to-one association to UserType
    @ManyToOne
    @JoinColumn(name="type")
    private UserType userType;

    //bi-directional many-to-one association to UserPhone
    @OneToMany(mappedBy="user")
    private List<UserPhone> userPhones;

    //bi-directional many-to-one association to UserPicture
    @OneToMany(mappedBy="user")
    private List<UserPicture> userPictures;

    //bi-directional many-to-one association to UserSocialNetwork
    @OneToMany(mappedBy="user")
    private List<UserSocialNetwork> userSocialNetworks;

       // getters and setters

}

А это его бин, UserBean (в пакете bean.entity):

@ManagedBean
@SessionScoped
public class UserBean implements Serializable {
    private static final long serialVersionUID = -1626847931067187536L;

    private int id;

    @NotNull(message="informe seu e-mail")
    @Email(message="e-mail inválido")
    private String email;

    @NotNull(message = "6 dígitos no mínimo")
    @Size(min = 6, max = 128, message = "6 dígitos no mínimo")
    private String password;

    @NotNull(message = "6 dígitos no mínimo")
    @Size(min = 6, max = 128, message = "6 dígitos no mínimo")
    private String password_2;

    private int reputation;

    private UserType userType;

    private List<UserPhoneBean> userPhones;

    private List<UserPicture> userPictures;

    private List<UserSocialNetwork> userSocialNetworks;

    @AssertTrue(message = "senhas diferentes")
    public boolean isPasswordsEquals() {
        return password.equals(password_2);
    }

        // getters and setters

}

Затем при каждом действии, связанном с пользователем, я бы хотел сохранить элемент управления в одном месте, поэтому я создаю UserControl bean:

@ManagedBean(name="userc")
@ViewScoped
public class UserControl implements Serializable {
    private static final long serialVersionUID = -1626847931067187536L;

    @EJB EaoUser eaoUser;
    @EJB EaoPerson eaoPerson;

    @ManagedProperty("#{userBean}")
    private UserBean user;

    @ManagedProperty("#{personBean}")
    private PersonBean person;

    private UserBean ub;
    private PersonBean pb;

    private View view;


    public UserControl() {
        ub = new UserBean();
        pb = new PersonBean();
        view = new View();
    }

    public String login(){
        List<User> list = eaoUser.findByEmail(ub.getEmail());
        User u = list.get(0);

            if (Crypto.check(ub.getPassword(), u.getPassword())){
                HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false); 
                session.setAttribute("authenticated", true);

                user = new UserBean();
                user.setId(u.getId());
                user.setEmail(u.getEmail());
                user.setPassword(u.getPassword());
                user.setReputation(u.getReputation());

                user.setUserType(u.getUserType());

                if (u.getUserType().getId() == 10){
                    Person p = eaoPerson.find(u.getId());

                    if (p != null){
                        person = new PersonBean();
                        person.setName(p.getName());
                        person.setSurname(p.getSurname());
                        person.setBirthdate(p.getBirthdate());
                        person.setGender(p.getGender());
                    }
                }

                for (UserPhone up : u.getUserPhones()){
                    user.getUserPhones().add(new UserPhoneBean(up.getId(), up.getPhone()));
                }

                user.setUserPictures(u.getUserPictures());
                user.setUserSocialNetworks(u.getUserSocialNetworks());

            }else{
                view.imageError();
                view.setStatus("e-mail ou senha incorretos");
                view.setPopup(true);

                return "#";
            }

        return "secured/user/home?faces-redirect=true";
    }
        // others method, getters and setters
}

Обратите внимание, что я вставляю userBean здесь в userControl , поэтому, когда пользователь входит в систему, я спасаю значение из базы данных и устанавливаю в userBean.

Я создаю атрибут user и ub , потому что когда я пытаюсь проверить с помощью user , проверка не работает, я думаю, это потому, что он уже введен (только предположение).

Итак, после всего этого объяснения, когда я пытаюсь войти в систему, пользователь (который вводится) больше не сохраняет никакого значения.

Если я попытаюсь сделать это:

Welcome, <h:outputText value="#{userc.user.email}" />

Не появляется ничего ..

Так что мне интересно, правильна ли моя структура. Что вы, ребята, думаете об этом?

1 Ответ

1 голос
/ 02 ноября 2011

Эта проблема не имеет ничего общего со структурой проекта.

Реальная проблема здесь, в методе login():

user = new UserBean();

Вы переопределяете JSF-инъекциюуправляемый компонент с помощью созданного вручную компонента.Этот не будет использоваться JSF и теряется после того, как представление уходит.Управляемое JSF-свойство user не должно быть null в этой точке.Вам не нужно создавать это самостоятельно.Удалите эту строку в целом.

Но у вас есть и другие большие проблемы: копирование свойств из одного User в другой User совершенно не нужно.По сути, вам нужно добавить свойство User в класс UserBean и вместо этого сделать user.setUser(user);.Таким образом, он доступен по #{userBean.user.email}.Я мог бы только переименовать один или другой, чтобы код EL имел больше смысла.Вы бы хотели получить что-то вроде #{user.current.email} или #{login.user.email} или #{auth.user.email} и т. Д.

...