Пользовательский SessionListener, имя не связано в этом контексте, javax.naming.NameNotFoundException - PullRequest
0 голосов
/ 05 января 2011

Я пытаюсь реализовать HttpSessionListener, чтобы пользователи этого слушателя могли зарегистрировать реализацию интерфейса ISessionEvent для сеанса Events.code ниже:


public class MySessionListener implements HttpSessionListener{

 @Resource
 ISessionEvent sessionEvent;

 public ISessionEvent getSessionEvent() {
  return sessionEvent;
 }

 public void setSessionEvent(ISessionEvent sessionEvent) {
  this.sessionEvent = sessionEvent;
 }

 @Override
 public void sessionCreated(HttpSessionEvent arg0) {
  sessionEvent.SessionCreated(arg0.getSession());
 }

 @Override
 public void sessionDestroyed(HttpSessionEvent arg0) {
  sessionEvent.SessionDestroyed(arg0.getSession());
 }
}

Когда пользователь реализует ISessionEvent и добавляет в качестве компонента, SessionCreated иФункции реализации SessionDestroyed будут вызываться при возникновении этих событий.Вы можете спросить, почему вы просто не пишете внутри методов слушателей, я просто не пытаюсь.

Когда я пытаюсь выполнить приведенный выше код, я получаю следующее сообщение об ошибке:


javax.naming.NameNotFoundException: Name com.mehmet6parmak.sessionlistener.MySessionListener is not bound in this Context
 at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
 at org.apache.catalina.util.DefaultAnnotationProcessor.lookupFieldResource(DefaultAnnotationProcessor.java:278)
 at org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:187)
 at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4082)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
 at org.apache.catalina.core.StandardService.start(StandardService.java:519)
 at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)

Аннотация ресурсавызывает ошибку, но я не смог ее устранить.

Спасибо всем ...

Интерфейс и реализация

<code>
@Resource
public interface ISessionEvent {</p>

<p>public void SessionCreated(HttpSession session);
 public void SessionDestroyed(HttpSession session);</p>

<p>}


@Resource
public class SessionEvent implements ISessionEvent {

 @Override
 public void SessionDestroyed(HttpSession session) {
  System.out.println("From Session Event Callback(Destroy):" + session.getId());
 }

 @Override
 public void SessionCreated(HttpSession session) {
  System.out.println("From Session Event Callback(Create):" + session.getId());
 }

}

Определение бина



<context:annotation-config/>
<context:component-scan base-package="com.mehmet6parmak">
</context:component-scan>

<bean id="sessionEvent" autowire="byName" class="com.mehmet6parmak.sessionlistener.SessionEvent"></bean>

Решение: Использование метода, используемого в ссылка работает.

Ответы [ 2 ]

1 голос
/ 05 января 2011

Это просто потому, что ISessionEvent не управляется, я считаю. Имеет ли он аннотацию @Resource? Что-то вроде

@Resource
public class ISessionEvent {...}
0 голосов
/ 05 января 2011

У меня нет опыта работы с аннотированными слушателями и Ко, но, я проверил метод на спецификации, я встретил следующее:

protected static void lookupFieldResource(javax.naming.Context context,
                                          java.lang.Object instance,
                                          java.lang.reflect.Field field,
                                          java.lang.String name,
                                          java.lang.Class<?> clazz)
                                   throws javax.naming.NamingException,
                                          java.lang.IllegalAccessException

Внедрить ресурсы в указанное поле. Броски: javax.naming.NamingException java.lang.IllegalAccessException

это означает, что вы пытаетесь внедрить ресурс в свое поле, который должен быть ресурсом JNDI.

@ Аннотация ресурса работает с JNDI-записью: http://download.oracle.com/javaee/5/api/javax/annotation/Resource.html

Вы забыли определить свои ресурсы в контексте JNDI?

Обновление Статья о внедрении ресурсов: http://java.sun.com/developer/technicalArticles/J2EE/injection/

...