Nano Hash - криптовалюты, майнинг, программирование

Struts2.5.12 - NPE при использовании метода getText из ActionSupport


Я переношу проект со Struts 2.3.3 на Struts 2.5.12 и вижу NullPointerException при использовании метода getText из класса ActionSupport.

Мой класс действий расширяет класс ActionSupport. У меня есть файл package.properties, также упакованный в файл war.

Мой класс действий выглядит так:

public class MyAction extends ActionSupport {
    private List<String> months = new ArrayList<>(
            Arrays.asList(getText("date.month.default"), "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"));
}

И в файле package.properties у меня есть

date.month.default=MM

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

ERROR DefaultDispatcherErrorHandler Exception occurred during processing request: Unable to instantiate Action, entryAction,  defined for 'entry' in namespace '/'Error creating bean with name 'entryAction' defined in "/D:/Software/JBossEAP/jboss-eap-7.0/bin/content/Member.war/WEB-INF/classes/my/company/member/web/action/entry/spring-context.xml": Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [my.company.member.web.action.entry.EntryAction]: Constructor threw exception; nested exception is java.lang.NullPointerException
 Unable to instantiate Action, entryAction,  defined for 'entry' in namespace '/'Error creating bean with name 'entryAction' defined in "/D:/Software/JBossEAP/jboss-eap-7.0/bin/content/Member.war/WEB-INF/classes/my/company/member/web/action/entry/spring-context.xml": Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [my.company.member.web.action.entry.EntryAction]: Constructor threw exception; nested exception is java.lang.NullPointerException - action - vfs:/D:/Software/JBossEAP/jboss-eap-7.0/bin/content/Member.war/WEB-INF/classes/struts-default.xml:133:44
    at com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:318)
    at com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:399)
    at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:204)
    at org.apache.struts2.factory.StrutsActionProxy.prepare(StrutsActionProxy.java:62)
    at org.apache.struts2.factory.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:37)
    at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:567)
    at org.apache.struts2.dispatcher.ExecuteOperations.executeAction(ExecuteOperations.java:81)
    at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:143)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
    at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
    at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:285)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:264)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:175)
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:792)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entryAction' defined in "/D:/Software/JBossEAP/jboss-eap-7.0/bin/content/Member.war/WEB-INF/classes/my/company/member/web/action/entry/spring-context.xml": Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [my.company.member.web.action.entry.EntryAction]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:965)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:911)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1075)
    at com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:159)
    at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:172)
    at com.opensymphony.xwork2.factory.DefaultActionFactory.buildAction(DefaultActionFactory.java:22)
    at com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:137)
    at com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:299)
    ... 37 more
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [my.company.member.web.action.entry.EntryAction]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:141)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:74)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:958)
    ... 48 more
Caused by: java.lang.NullPointerException
    at com.opensymphony.xwork2.ActionSupport.getTextProvider(ActionSupport.java:278)
    at com.opensymphony.xwork2.ActionSupport.getText(ActionSupport.java:83)
    at my.company.member.web.action.MyAction.<init>(MyAction.java:95)
    at my.company.member.web.action.entry.EntryAction.<init>(EntryAction.java:22)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
    ... 50 more

Структура проекта:
 введите описание изображения здесь

Построенная WAR имеет следующую структуру:
 введите описание изображения здесь

Ниже файлы jar добавляются в WEB-INF / lib в файле WAR:
classworlds-1.1.jar
com.springsource.org.aopalliance-1.0.0.jar
commons-betwixt-0.8.jar
commons-chain-1.2.jar
commons-digester-1.8.jar
commons-fileupload-1.2.1.jar
commons-httpclient-3.1.jar
commons-io-2.4 .jar
commons-lang3-3.6.jar
commons-validator-1.3.1.jar
freemarker-2.3.23.jar
gson-2.1.jar
httpclient-4.3-beta1 .jar
httpclient-osgi-4.3.jar
httpcore-4.2.2.jar
javassist-3.18.0-GA.jar
jaxrpc-api-1.1.jar
jcifs-1.3 .17.jar
log4j-api-2.8.2.jar
ognl-3.1.12.jar
oro-2.0.8.jar
сериализатором-2.7.1.jar
Spring -aop-3.0.5.RELEASE.jar
spring-asm-3.0.5.RELEASE.jar
Spring-beans-3.0.5.RELEASE.jar
spring-context-3.0.5.RELEASE .jar
Spring-context-support-3.0.5.RELEASE.jar
Spring-core-3.0.5.RELEASE.jar
Spring-expression-3.0.5.RELEASE.jar
Spring -jdbc-3.0.5.RELEASE.jar
spring-jms-3.0.5.RELEASE.jar
spring-orm-3.0.5.RELEASE.jar
spring-remoting-2.0.8.jar
spring-tx-3.0.5.RELEASE.jar
spring-web-3.0.5.RELEASE.jar
struts2-core-2.5.12.jar < br> struts2-json-plugin-2.5.12.jar
struts2-spring-plugin-2.5.12.jar
struts2-tile-plugin-2.5.12.jar
tile-api-3.0. 7.jar
плитки-autotag-core-runtime-1.2.jar
плитки-core-3.0.7.jar
плитки-el-3.0.7.jar
плитки-freemarker-3.0. 7.jar
плитки-jsp-3.0.7.jar
плитки-ognl-3.0.7.jar
плитки-запрос-api-1.0.6.jar
плитки-request-freemarker- 1.0.6.jar
плитки-запрос-jsp-1.0.6.jar
плитки-запрос-сервлет-1.0.6.jar
плитки-сервлет-3.0.7.jar
плитки- template-3.0.7.jar
wsdl4j-1.5.1.jar
xml-apis-1.3.02.jar


  • Не могли бы вы опубликовать исходный код класса действий? 27.07.2017
  • Привет @RomanC, Спасибо за ответ. Я обновил свой вопрос, добавив исходный код класса действия. 27.07.2017
  • Информации недостаточно. Если трассировка стека заполнена, у вас проблемы с управлением зависимостями. 27.07.2017
  • Вы не можете использовать getText так. Поместите ключ в список и сделайте i18n в представлении. 27.07.2017
  • Привет, @RomanC, спасибо за ответ ... что вы имеете в виду под проблемами с управлением зависимостями? Вы говорите, что мне не хватает банки или я использую недопустимую банку? 31.07.2017
  • Привет @AleksandrM, спасибо за вариант. Но зачем мне это делать? В struts 2.3.3 я просто кодирую как ‹s: text name = xyz /›, чтобы выбрать значение из файла package.properties. Разве это не работает со Struts 2.5.12? 31.07.2017
  • Я пытался отладить это и обнаружил, что контейнер имеет значение NULL в классе ActionSupport, поэтому я вижу NPE в строке номер 278, а именно: TextProviderFactory tpf = container.getInstance (TextProviderFactory.class); 31.07.2017
  • @Prasann Как ты думаешь, твои банки в порядке? Не могли бы вы опубликовать структуру проекта со всеми из них. 31.07.2017
  • @RomanC - По соображениям безопасности я не могу распечатать свой проект как есть, но я воспроизвел точную структуру с тестовыми значениями. Теперь я обновил свой вопрос, указав структуру проекта, файловую структуру WAR и файлы jar, упакованные в WAR. Пожалуйста, дайте мне знать, если вы видите что-то не так. 31.07.2017
  • @Prasann Если вы уже используете <s:text>, тогда зачем вам getText в этом месте? 31.07.2017
  • Привет, @AleksandrM, я могу использовать ‹s: text› из JSP, но из классов действий мне нужно использовать метод getText (). 02.08.2017

Ответы:


1

Не используйте файл с именем struts-default.xml. Это файл конфигурации, который загружается по умолчанию. Имя файла конфигурации по умолчанию для приложения - struts.xml.

Переименовать этот файл

struts-default.xml

to

struts.xml
31.07.2017
  • Спасибо, Роман, я почему-то не заметил, что struts.properties не содержит struts-default.xml, указанного для ключевых struts.configuration.files. Теперь я могу использовать даже struts-default.xml, добавив его или переименовав в struts.xml, и он отлично работает. 02.08.2017
  • Я сделал это сейчас :) 03.08.2017
  • @RishikeshDarandale Если у вас есть вопрос, задайте вопрос. 03.08.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..