0

I'm using Weld CDI version 3.0.1 on Glassfish 5 with CDI API 2.0 and Java 8. I've just created a simple application with a LoginController class that should just accept 'asd' as username and 'asd' as password and set a User object to my SessionController which is a @SessionScoped bean.

The problem I'm facing is that the user is set to the user property of my SessionController but not to the user property of the SessionController$Proxy$_$$_WeldClientProxy.

Stack:

Daemon Thread [http-listener-2(5)] (Suspended (breakpoint at line 42 in SessionController)) 
    SessionController.setUser(User) line: 42    
    SessionController$Proxy$_$$_WeldClientProxy.setUser(User) line: not available   
    LoginController.startUserSession() line: 57 
    LoginController.login() line: 45    
    NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
    NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62  
    DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
    Method.invoke(Object, Object...) line: 498  
    ReflectionUtil.invokeMethod(ELContext, Method, Object, Object[]) line: 181  
    AstValue.invoke(EvaluationContext, Class[], Object[]) line: 289 
    MethodExpressionImpl.invoke(ELContext, Object[]) line: 304  
    WeldMethodExpression(ForwardingMethodExpression).invoke(ELContext, Object[]) line: 40   
    WeldMethodExpression.invoke(ELContext, Object[]) line: 50   
    TagMethodExpression.invoke(ELContext, Object[]) line: 107   
    MethodBindingMethodExpressionAdapter.invoke(FacesContext, Object[]) line: 87    
    ActionListenerImpl.processAction(ActionEvent) line: 102 
    DialogActionListener.processAction(ActionEvent) line: 45    
    CommandButton(UICommand).broadcast(FacesEvent) line: 330    
    UIViewRoot.broadcastEvents(FacesContext, PhaseId) line: 870 
    UIViewRoot.processApplication(FacesContext) line: 1418  
    InvokeApplicationPhase.execute(FacesContext) line: 82   
    InvokeApplicationPhase(Phase).doPhase(FacesContext, Lifecycle, ListIterator<PhaseListener>) line: 100   
    LifecycleImpl.execute(FacesContext) line: 201   
    FacesServlet.service(ServletRequest, ServletResponse) line: 670 
    StandardWrapper.service(ServletRequest, ServletResponse, Servlet) line: 1581    
    ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 338  
    ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 208  
    NoCacheFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 46   
    ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 250  
    ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 208  
    Log4jServletFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 71  
    ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 250  
    ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 208  
    StandardWrapperValve.invoke(Request, Response) line: 256    
    StandardContextValve.invoke(Request, Response) line: 160    
    WebPipeline(StandardPipeline).doInvoke(Request, Response, boolean) line: 652    
    WebPipeline(StandardPipeline).invoke(Request, Response) line: 591   
    WebPipeline.invoke(Request, Response) line: 99  
    StandardHostValve.invoke(Request, Response) line: 155   
    CoyoteAdapter.doService(Request, Request, Response, Response, boolean) line: 373    
    CoyoteAdapter.service(Request, Response) line: 240  
    ContainerMapper$HttpHandlerCallable.call() line: 463    
    ContainerMapper.service(Request, Response) line: 168    
    ContainerMapper(HttpHandler).runService(Request, Response) line: 206    
    ContainerMapper(HttpHandler).doHandle(Request, Response) line: 180  
    HttpServerFilter.handleRead(FilterChainContext) line: 242   
    ExecutorResolver$9.execute(Filter, FilterChainContext) line: 119    
    DefaultFilterChain.executeFilter(FilterExecutor, Filter, FilterChainContext) line: 284  
    DefaultFilterChain.executeChainPart(FilterChainContext, FilterExecutor, int, int, DefaultFilterChain$FiltersState) line: 201    
    DefaultFilterChain.execute(FilterChainContext) line: 133    
    DefaultFilterChain.process(Context) line: 112   
    ProcessorExecutor.execute(Context) line: 77 
    TCPNIOTransport.fireIOEvent(IOEvent, Connection, IOEventLifeCycleListener) line: 539    
    AbstractIOStrategy.fireIOEvent(Connection, IOEvent, IOEventLifeCycleListener, Logger) line: 112 
    WorkerThreadIOStrategy.run0(Connection, IOEvent, IOEventLifeCycleListener) line: 117    
    WorkerThreadIOStrategy.access$100(Connection, IOEvent, IOEventLifeCycleListener) line: 56   
    WorkerThreadIOStrategy$WorkerThreadRunnable.run() line: 137 
    FixedThreadPool$BasicWorker(AbstractThreadPool$Worker).doWork() line: 593   
    FixedThreadPool$BasicWorker(AbstractThreadPool$Worker).run() line: 573  
    DefaultWorkerThread(Thread).run() line: 748 

This results in a null user property in my SessionController$Proxy$_$$_WeldClientProxy.

SessionController:

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.company.models.User;

@SessionScoped
@Named
public class SessionController implements Serializable {

    private static final Logger log = LogManager.getLogger(SessionController.class);
    private static final long serialVersionUID = 1L;

    @PostConstruct
    public void init() {
        log.debug("session in session.@PostConstruct: {}", this.toString() );
    }

    private User user;

    public void setUser(User user) {
        this.user = user;
    }

    public User getUser() {
        return user;
    }

LoginController:

import java.io.Serializable;
import java.util.Locale;

import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.company.models.User;

@Named
@RequestScoped
public class LoginController implements Serializable {

    private static final Logger log = LogManager.getLogger(LoginController.class);
    private static final long serialVersionUID = 1L;

    private User user;
    private boolean loginStatus;

    @Inject SessionController session;

    @PostConstruct
    public void init() {
        FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("it"));
        user = new User();

        log.debug("session in loginController.@PostConstruct: {}", session.toString() );
    }

    public String login() {
        if (authenticateWithCredentials()) {
            loginStatus = true;
            startUserSession();
            return "/home.xhtml?faces-redirect=true";
        } else {
            FacesContext fc = FacesContext.getCurrentInstance();
            fc.addMessage(null, new FacesMessage("Wrong username or password"));

            loginStatus = false;
            return null;
        }
    }

    private void startUserSession() {
        session.setUser(user);
        log.debug("session in loginController.startUserSession: {}", session.toString() );
    }

    private boolean authenticateWithCredentials() {
        if (user.getUsername().equals("asd") && user.getPassword().equals("asd")) {
            return true;
        } else {
            return false;
        }
    }

    ...
Kukeltje
  • 12,223
  • 4
  • 24
  • 47
500 Server error
  • 644
  • 13
  • 28
  • 2
    That is how it is supposed to work... That's why it is a proxy... If in reading the property elsewhere you get 'null' it most likely is because of the proxy pointing to a different instance. – Kukeltje Mar 13 '18 at 17:26
  • But i'm always injecting the SessionController and using supposedly the same proxy instance, which in turn should have the same object instance. Why should it change? I mean if I stop the debug at this point `SessionController$Proxy$_$$_WeldClientProxy.setUser()` (see stack above) and evaluate a `SessionController$Proxy$_$$_WeldClientProxy.getUser()` call it returns null. while it had already set the value in the real object. – 500 Server error Mar 14 '18 at 08:08
  • It was an error from my colleague. As per the CDI it's working perfectly. Should I delete the question? :/ – 500 Server error Mar 14 '18 at 08:53

0 Answers0