我在使用CDI API 2.0和Java 8的Glassfish 5上使用Weld CDI 3.0.1版。
我刚刚创建了一个简单的应用程序,其中LoginController
类应该接受' asd'作为用户名和' asd'作为密码并将User
对象设置为我的SessionController
@SessionScoped
bean。
我面临的问题是,用户设置为SessionController
的用户属性,而不是SessionController$Proxy$_$$_WeldClientProxy
的用户属性。< / p>
堆栈:
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
这导致我的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;
}
}
...