我想从 Servlet 类中调用 Seam 组件私有方法。我使用 servlet 类作为 ContextualHttpServletRequest,因此我可以访问组件 bean。检查代码示例。
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
String userId = "U00001";
String userGroupCd = "00000000";
FacesContext facesContext = null;
try {
facesContext = getFacesContext(request, response);
} catch (Exception e) {
e.printStackTrace();
}
loginUtility = (ClientUtility) Component.getInstance("utility");
Method clientInfoMethod = null;
try {
clientInfoMethod = getDeclaredMethod(loginUtility, "createClientInfo", String.class, String.class);
clientInfoMethod.setAccessible(true);
clientInfoMethod.invoke(loginUtility, userId, userGroupCd);
} catch (IllegalArgumentException e1) {
// TODO 自動生成された catch ブロック
e1.printStackTrace();
} catch (SecurityException e1) {
// TODO 自動生成された catch ブロック
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO 自動生成された catch ブロック
e1.printStackTrace();
} catch (InvocationTargetException e1) {
// TODO 自動生成された catch ブロック
e1.printStackTrace();
// } catch (NoSuchMethodException e1) {
// // TODO 自動生成された catch ブロック
// e1.printStackTrace();
} finally {
clientInfoMethod.setAccessible(false);
}
}
private <T extends Object> Method getDeclaredMethod(T obj, String name, Class<?>... parameters) {
Method declaredMethod = null;
Method[] methods = Component.forName("loginUtility").getBeanClass().getDeclaredMethods();
for (Method var : methods) {
if (var.getName().contains(name) && parameters.length == var.getParameterTypes().length) {
declaredMethod = var;
return declaredMethod;
}
}
return declaredMethod;
}
接缝组件结构如下:
@Name("utility")
@Scope(ScopeType.SESSION)
public class ClientUtility implements IfFlowUtility, Serializable {
private void createClientInfo(String userId, String userGroupCd) {
InternalClientInfo info = (InternalClientInfo) Contexts.getSessionContext().get(SESSION_KEY_CLIENT_INFO);
if (info == null) {
info = new InternalClientInfo();
}
info.setUserId(userId);
info.setUserGroupCd(userGroupCd);
HttpServletRequestUtil util = new HttpServletRequestUtil();
info.setClientINetAddr(util.getClientINetAddr());
HttpSession session = util.getSession();
Conversation conv = (Conversation) Contexts.getConversationContext().get(CONTEXT_NAME_CONVERSATION);
if (conv != null) {
info.setConvasationId(conv.getId());
info.setViewName(conv.getViewId());
}
info.setSessionId(session.getId());
info.setAuthToken(loginStatusManager.getAuthToken(userId, userGroupCd));
this.setSessionId(info.getSessionId());
this.clientInfo = info;
this.accessor.setSessionAttribute(SESSION_KEY_CLIENT_INFO, clientInfo);
}
}
但是当调用 clientInfoMethod.invoke() 方法时出现以下错误:
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) java.lang.reflect.InvocationTargetException
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at java.lang.reflect.Method.invoke(Method.java:597)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at jp.co.dirbi.fast.front.comon.servlet.CommonSsoInit.processRequest(CommonSsoInit.java:73)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at jp.co.dirbi.fast.front.comon.servlet.AbstractFacesServlet$1.process(AbstractFacesServlet.java:48)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.ContextualHttpServletRequest.run(ContextualHttpServletRequest.java:53)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at jp.co.dirbi.fast.front.comon.servlet.AbstractFacesServlet.service(AbstractFacesServlet.java:50)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at jp.co.dirbi.falcon.online.component.web.seam.SystemFilter.doFilter(SystemFilter.java:253)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:73)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.web.ContextFilter$1.process(ContextFilter.java:42)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.ContextualHttpServletRequest.run(ContextualHttpServletRequest.java:53)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.web.ContextFilter.doFilter(ContextFilter.java:37)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at java.lang.Thread.run(Thread.java:662)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) Caused by: java.lang.NullPointerException
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) at jp.co.dirbi.falcon.online.component.authenticate.LoginUtility.createClientInfo(LoginUtility.java:794)
2013-05-29 00:20:45,921 ERROR [STDERR] (http-127.0.0.1-8080-1) ... 57 more
任何人都可以帮助我或提供一些建议吗?