Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于用户管理的Vaadin ThreadLocal_Java_Vaadin_Thread Local - Fatal编程技术网

Java 用于用户管理的Vaadin ThreadLocal

Java 用于用户管理的Vaadin ThreadLocal,java,vaadin,thread-local,Java,Vaadin,Thread Local,我目前正在用Java开发一个web应用程序,它将被多个用户同时访问,因此需要存储用户数据,以便根据他们的个人需求(例如他们所属的公司等)定制应用程序 我使用两个类来管理它。用户,主系统详情如下: 用户 @Entity public class User implements Serializable{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private S

我目前正在用Java开发一个web应用程序,它将被多个用户同时访问,因此需要存储用户数据,以便根据他们的个人需求(例如他们所属的公司等)定制应用程序

我使用两个类来管理它。用户,主系统详情如下:

用户

@Entity
public class User implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String firstName;
    private String lastName;
    private String username;
    private String password;
    private String type;
    private String company;
    private String DOB;
    private String email;
    private int PayrollId;

    public User(String firstName, String lastName, String username, String password, String type, String company, String DOB, String email) {
        this.firstName = firstName;
        this. lastName = lastName;
        this.username = username;
        this.password = password;
        this.type = type;
        this.company = company;
        this.DOB = DOB;
        this.email = email;
    }
主系统:

public class MainSystem   {

    public UserController userController;
    private UserRepository userRepository;
    private static ThreadLocal<User> loggedInUser = new ThreadLocal<>();
    public DbController dbController;


public MainSystem(){
userController = new UserController(userRepository);
loggedInUser.set(new User());
}

 public Boolean Login(String username, String password) {
        if(userController.checkUser(username,password)){
            User aUser = userController.getUser(username);
            setLoggedInUser(userController.getUser(username));
            VaadinSession.getCurrent().setAttribute("username",loggedInUser.get().getUsername());
            System.out.println("Logged in User:  "+loggedInUser.get().getUsername());
               return true;
        }
        else {
            return false;
        }
        }

        public static void setLoggedInUser(User user){
        loggedInUser.set(user);
        }

    public static User  getLoggedInUser() {
        return loggedInUser.get();
    }
然而,我发现它给我提供了一个“null”值?我担心我可能误解了ThreadLocal的工作原理。但本质上,我试图实现的是在main系统中存储User.Class的实例相关变量,以便其他类使用

任何帮助都将不胜感激

我的解决方案:

我的解决方案是将User.class存储在VaadinSession属性中,如下所示:

public Boolean Login(String username, String password) {
        if(userController.checkUser(username,password)){
            User aUser = userController.getUser(username);
            VaadinSession.getCurrent().setAttribute("user",aUser);
                          VaadinSession.getCurrent().setAttribute("username",loggedInUser.get().getUsername());
            System.out.println("Logged in User:  "+loggedInUser.get().getUsername());
               return true;
        }
        else {
            return false;
        }
        }
然后在其他类中,如果我想使用该属性,我会像这样检索它:

@Override
    public void enter(ViewChangeListener.ViewChangeEvent event) {
       try {
           aUser = (User)VaadinSession.getCurrent().getAttribute("user");
       }
        catch (Exception e){
           System.out.println(e.getMessage());
        }
    }

问题是不能保证
MainSystem.Login()
EditProfileView.enter()
会发生在同一个线程上。每个用户操作都作为一个单独的HTTP请求处理,servlet容器将在任何可用线程上运行

对于这种功能,我建议将用户信息存储在HTTP会话中。如果您没有任何自定义servlet之类的,您可以在自己的自定义
UI
类中创建一个包含用户对象的字段。Vaadin负责使
UI.getCurrent()
始终在通过Vaadin运行的所有代码中返回正确的值


如果还与其他servlet功能集成,则可以将用户存储在
HttpSession
中。通用servlet代码可以通过servlet请求和响应中的
getSession()
方法找到会话。在Vaadin运行的代码中,您可以使用
VaadinSession().getCurrent().getSession()
来获取一个基于相同
HttpSession
数据的
WrappedSession
实例。

问题是不能保证
MainSystem.Login()
EditProfileView.enter()
将发生在同一线程上。每个用户操作都作为一个单独的HTTP请求处理,servlet容器将在任何可用线程上运行

对于这种功能,我建议将用户信息存储在HTTP会话中。如果您没有任何自定义servlet之类的,您可以在自己的自定义
UI
类中创建一个包含用户对象的字段。Vaadin负责使
UI.getCurrent()
始终在通过Vaadin运行的所有代码中返回正确的值


如果还与其他servlet功能集成,则可以将用户存储在
HttpSession
中。通用servlet代码可以通过servlet请求和响应中的
getSession()
方法找到会话。在Vaadin运行的代码中,您可以使用
VaadinSession().getCurrent().getSession()
获取基于相同
HttpSession
数据的
WrappedSession
实例。

还有另一种方法。相反,可以创建@SessionScoped用户服务,或者@Inject或@Autowire,这取决于您使用的是CDI还是Spring。这样做时,bean管理器负责将正确的实体与视图绑定。

还有另一种方法。相反,可以创建@SessionScoped用户服务,或者@Inject或@Autowire,这取决于您使用的是CDI还是Spring。这样做时,bean管理器将负责将正确的实体与视图绑定。

因此,如果我存储了类似于普通变量的内容,即loggedInUser=setLoggedInUser(userController.getUser(username)),则在UI类中;然后我就可以使用VaadinSession().getCurrent().getLoggedInUser()?实现是什么样子的?如果您向
UI
类添加一个实例字段,并为该字段添加一个getter,那么您可以执行类似
User loggedInUser=((MyUI)UI.getCurrent()).getLoggedInUser()的操作我要将您的答案标记为正确,它不是我使用的答案,但它确实让我走上了正确的轨道,并且事实上符合标准。因此,在UI类中,如果我存储了类似于普通变量的内容,即loggedInUser=setLoggedInUser(userController.getUser(username));然后我就可以使用VaadinSession().getCurrent().getLoggedInUser()?实现是什么样子的?如果您向
UI
类添加一个实例字段,并为该字段添加一个getter,那么您可以执行类似
User loggedInUser=((MyUI)UI.getCurrent()).getLoggedInUser()的操作我将把你的答案标记为正确的,它不是我使用的答案,但它确实让我走上了正确的轨道,并且事实上符合标准。
@Override
    public void enter(ViewChangeListener.ViewChangeEvent event) {
       try {
           aUser = (User)VaadinSession.getCurrent().getAttribute("user");
       }
        catch (Exception e){
           System.out.println(e.getMessage());
        }
    }