Весенний новичок Нет доступного контекста - PullRequest
1 голос
/ 21 июня 2010

Я пытаюсь настроить конфигурацию Spring с помощью учебников и прочего.Кажется, все в порядке, но когда я вызываю конструктор Бина с @Resource, все взрывается.

Я также даю попытку Apache Click убить двух зайцев одним выстрелом.

Пожалуйста, кто-нибудь может сказать мне, что здесь происходит и как я могу это исправить?

Спасибо.

Ошибка:

Caused by: java.lang.RuntimeException: No Context available on ThreadLocal Context Stack
at org.apache.click.Context$ContextStack.peek(Context.java:934)
at org.apache.click.Context$ContextStack.access$000(Context.java:885)
at org.apache.click.Context.getThreadLocalContext(Context.java:168)
at org.apache.click.extras.control.MenuFactory.loadFromMenuXml(MenuFactory.java:495)
at org.apache.click.extras.control.MenuFactory.getRootMenu(MenuFactory.java:302)
at org.apache.click.extras.control.MenuFactory.getRootMenu(MenuFactory.java:255)
at org.apache.click.extras.control.MenuFactory.getRootMenu(MenuFactory.java:197)
at org.test.pages.BasePage.<init>(BasePage.java:15)
at org.test.pages.HomePage.<init>(HomePage.java:24)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
... 30 more

Этоmy applicationContext.xml:

<context:annotation-config />

<context:component-scan base-package="org.test" />
<tx:annotation-driven />

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.OracleDriver" />
    <property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.0.10:1521:xe" />
    <property name="user" value="HR" />
    <property name="password" value="hr"/>

</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="ctest" />
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" />
            <property name="showSql" value="true" />
        </bean>
    </property>

</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

Это мой web.xml:

    <display-name>CTest</display-name>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>ClickServlet</servlet-name>
    <servlet-class>org.apache.click.extras.spring.SpringClickServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>ClickServlet</servlet-name>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>index.htm</welcome-file>
</welcome-file-list>


Редактировать: я изменил код в соответствии с предложением, но мой даовсе еще ноль.Также в appContext я положил:

<context:component-scan base-package="org.test.pages" scope-resolver="org.apache.click.extras.spring.PageScopeResolver"/>

Хорошо, я пытался ввести свой Дао в моей IndexPage, но в конструкторе cTestDao имеет значение null.
Что я делаю не так?

Спасибо

Код класса IndexPage:

@Component @Scope("prototype")
public class IndexPage extends Page {

    @Resource
    protected CTestDao<Employee> cTestDao;

 public IndexPage(){
     super();
     List<Employee> list = cTestDao.getBeans(Employee.class);
     for(Employee e:list){
      String s = String.format("Name:%1 Last Name:%2 Salary%3€",e.getFirstName(),e.getLastName(),e.getSalary());
      System.out.println(s);
     }
 }
}

Ответы [ 4 ]

2 голосов
/ 21 июня 2010

Это на самом деле не имеет ничего общего с Spring. Ваш HomePage класс вызывает метод в Click API, что, по-видимому, ему запрещено.

Я предлагаю вам не пытаться убить двух зайцев одним выстрелом. Достаточно сложно выучить один фреймворк за раз, не пытаясь выучить два одновременно, так как вы всегда будете пытаться выяснить, что происходит не так.

Я предлагаю вывести Spring из уравнения, и сначала почувствуйте себя комфортно с Click. Или наоборот.

2 голосов
/ 21 июня 2010

Нажмите Framework документы предложить использовать scope = "prototype" для страниц.Если вы используете конфигурацию на основе аннотаций, это будет:

@Component @Scope("prototype")
2 голосов
/ 21 июня 2010

Это звучит совершенно не связано с Spring, так как ваша трассировка стека показывает исключение из классов org.apache.click.

Что делает org.test.pages.BasePage?

Я бы предложил обрезать ваш код до чего-то простого, например, вывести «Hello World» для проверки конфигурации и контекста Spring, а затем добавить другие библиотекихотел бы использовать в вашем веб-приложении.

1 голос
/ 22 июня 2010

Кажется, что вы хотите обрабатывать страницы Click как бины Spring, другими словами, вы хотите, чтобы Spring создавал страницу Click и вставлял зависимости. Spring поддерживает два типа внедрения зависимостей: через методы установки и конструктор. В приведенном выше примере вы обращаетесь к дао в конструкторе страницы, но оно может быть введено только после того, как страница была построена.

Я предлагаю вам переместить ваш код в метод PageInInit ().

В качестве альтернативы вы можете внедрить DAO в конструктор страницы "IndexPage (CTestDao dao)", но я не проверял, будет ли это работать или нет.

С уважением

Bob

...