LINUX.ORG.RU

JSF2 + Tomcat = такое ощущение, что бины не инстанциируются

 , ,


0

1

Взял уже пример с http://www.mkyong.com/jsf2/jsf-2-0-spring-integration-example/ . Добился, что все запустилось, задеплоилось. Но на страничке только статичный текст. В чем проблема? В несовместимости jsf и tomcat (где-то такое встретил в инете)? или еще в чем?

★★★★★

скастую для ускорения: Legioner, stevejobs, Nagwal

извините, если я зря вас потревожил.

bvn13 ★★★★★
() автор топика

Tomcat не умеет jsf по умолчанию, ЕМНИП. Тебе нужен TomEE. Как вариант, добавить какую-нибудь Mojarra как зависимость в pom.xml и таскать с собой (делал так с JSTL на Tomcat).

sad_but_true1
()
Последнее исправление: sad_but_true1 (всего исправлений: 1)
Ответ на: комментарий от sad_but_true1

Спасибо! Все-таки я где-то правильно прочитал про несовместимость, но не придал значения.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

Всё-таки было бы неплохо послушать чей-нибудь ответ о том почему с Томкатом такая проблема.

anonymous
()

А как ты деплоишь, как запускаешь, что в логах пишет. На томкате у меня jsf пускался в связке со спрингом. Проблемы были только в случае использования tomcat-embedded.

Если надо могу попробовать найти тот проект и конфиги именно под связку tomcat+jsf2+spring

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

Да, не в этом. Моджара говорила о своем запуске в выхлопе при деплое.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

Так, а про инициализацию спринга он чего то говорит?

Вот, на всякий случай web.xml, с которым у меня точно работал проект, именно в связке со спрингом (там стандартный jsf + primefaces)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name>Topcase NR Processor</display-name>

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

  <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>

  <listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
  </listener>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:/application-context.xml
      classpath:/security-context.xml
    </param-value>
  </context-param>

  <!-- Change to "Production" when you are ready to deploy -->
  <context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
  </context-param>

  <context-param>
    <param-name>com.sun.faces.enableMissingResourceLibraryDetection</param-name>
    <param-value>true</param-value>
  </context-param>

  <context-param>
    <param-name>javax.faces.CONFIG_FILES</param-name>
    <param-value>/WEB-INF/faces-config.xml</param-value>
  </context-param>

  <context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
  </context-param>

  <context-param>
    <param-name>primefaces.THEME</param-name>
    <param-value>bootstrap</param-value>
  </context-param>

  <context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
  </context-param>

  <context-param>
    <param-name>primefaces.UPLOADER</param-name>
    <param-value>commons</param-value>
  </context-param>

  <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:/dispatcher-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <filter>
    <filter-name>encoding-filter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>encoding-filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!-- JSF servlet mapping -->
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <!-- Map these files with JSF -->
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

  <!-- Primefaces file upload servlet -->
  <filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
  </filter-mapping>


  <session-config>
    <session-timeout>1440</session-timeout>
  </session-config>

  <mime-mapping>
    <extension>ecss</extension>
    <mime-type>text/css</mime-type>
  </mime-mapping>

  <welcome-file-list>
    <welcome-file>/faces/login.xhtml</welcome-file>
  </welcome-file-list>

</web-app>

И faces-config.xml

<?xml version='1.0' encoding='UTF-8'?>

<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
              version="2.0">
  <application>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>

    <locale-config>
      <default-locale>ru</default-locale>
    </locale-config>

    <resource-bundle>
      <base-name>messages</base-name>
      <var>msg</var>
    </resource-bundle>
  </application>

</faces-config>

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

И попробуй собрать отдельный war-ник для начала через clean package, закинуть его руками в томкат и стартануть его. Посмотри что будет.

P.S. Jsf, как и вообще все компонентные фреймворки - бяка. Бери лучше spring mvc, а клиента делай на каком нибудь bootstrap+angular

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

P.S. Jsf, как и вообще все компонентные фреймворки - бяка. Бери лучше spring mvc, а клиента делай на каком нибудь bootstrap+angular

Подпишусь под каждым словом.

php-coder ★★★★★
()
Ответ на: комментарий от Nagwal

P.S. Jsf, как и вообще все компонентные фреймворки - бяка. Бери лучше spring mvc, а клиента делай на каком нибудь bootstrap+angular

увеличиваю безмерно!

stevejobs ★★★★☆
()
Ответ на: комментарий от Nagwal

но у чуваков обычно такое объяснение: мы всё делаем на стандартной джаве, потому что у неё бесконечная поддержка, а со springsource мало ли что может случиться. Кроме того стандартная джава - стандартная, её все обязаны знать (т.е. легко найти новых погромистов), а вот спадет популярность на ваш спринг, где мы людей достанем

stevejobs ★★★★☆
()
Ответ на: комментарий от bvn13

Чтобы въехать изначально, нужна какая-нибудь неглубокая статья: туториал, пример. Этого трешняка в гугле куча, сам нагуглишь.

Как ни странно, самая лучшая из средне-глубоких книжек по спрингу - это его документация:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/ind...

В частности, собственно сам Spring MVC:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc...

Такое ощущение, что авторы книжек по спрингу (ну, тех что в амазоне), просто копипастят весь контент оттуда.

Глубоких-глубоких книжек я не знаю. Но есть куча отдельных интересных статей. Например, спринг-потрошитель часть1, часть2. Тоже какбы ничего особенного, хороший recap для того что есть в документации.

===

Насчёт создания клиента на Angular, ничего доброго неновичкого не посоветую, сам еще не разобрался.

На rutracker можно скчать зачетное вводное видео «Shaping up with Angular.js», чтобы понять, о чём это вообще.

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

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 2)
Ответ на: комментарий от stevejobs

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

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

В следующем году буду искать работу джава-программистом в Москве (сейчас не программирую почти), напишу тебе тогда вначале :)

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

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

Nagwal ★★★★
()
Ответ на: комментарий от stevejobs

Насчёт создания клиента на Angular, ничего доброго неновичкого не посоветую, сам еще не разобрался.

Да там в общем разбираться и нечего особо. Шаблоны для ангуляра можно как в обход спринга, аки голый html отдавать, так и через контроллеры, используя серверный шаблонизатор еще в придачу. Ну а как на spring mvc писать rest-сервисы в мануале прекрасно описано. Все в общем сводится к одной аннотации @ResponseBody

Вот пример «голого» проекта https://onedrive.live.com/redir?resid=97F01FD7A08FEAA7!78067&authkey=!ABg... который я коллегам специально делал как пример.

Там embedded tomcat, spring, spring security, spring mvc на серваке и ангуляр с бутстрапом на клиенте

Nagwal ★★★★
()
Ответ на: комментарий от Deleted

Ну а где этой магии нет то? В guice? Так он и не умеет нихрена по сравнению со спрингом. Или jee? Так там этой магии и поболее спринга будет.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

Так он и не умеет нихрена по сравнению со спрингом.

не умеет или может это сделано специально чтобы потом не было пятничных конфигураций которые глючат в зависимости от порядка jar в classpath?

Deleted
()
Ответ на: комментарий от bvn13

Потому что там нет ни одного xml-конфига для спринга, да и web.xml практически пустой. Там все через java config сделано.

Смотри ru.visang.commons.ServiceLauncher - в нем метод main, т.е. старутет это хозяйство как standalone ява приложение.

Там создается спринговый контекст, ему скармливается имя пакета для сканирования и поиска конфигураций. Он находит ru.visang.config.ApplicationConfig - и оттуда уже инстанциирует все спринговые бины.

Ну и немного магии с вот этим методом:

@Bean
public PostStartupInitializer tomcat() {
    return () -> {
        try {
            File base = createBaseDirectory();
            Tomcat tomcat = new Tomcat();
            tomcat.setBaseDir(base.getAbsolutePath());
            tomcat.setHostname(hostname);
            tomcat.setPort(port);
            Context context = tomcat.addWebapp("/", new File(webDir).getAbsolutePath());

            AnnotationConfigWebApplicationContext webCtx = new AnnotationConfigWebApplicationContext();
            webCtx.register(WebMVCConfig.class);
            webCtx.setParent(ctx);
            context.setApplicationLifecycleListeners(new Object[]{new ContextLoaderListener(webCtx)});

            context.addFilterDef(new FilterDefinition("springSecurityFilterChain", new DelegatingFilterProxy()));
            context.addFilterMap(new FilterMapping("springSecurityFilterChain", "/*"));

            tomcat.addServlet(context.getPath(), "dispatcherServlet", new DispatcherServlet(webCtx));
            context.addServletMapping("/*", "dispatcherServlet");

            CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
            characterEncodingFilter.setForceEncoding(true);
            characterEncodingFilter.setEncoding("UTF-8");
            context.addFilterDef(new FilterDefinition("encoding-filter", characterEncodingFilter));
            context.addFilterMap(new FilterMapping("encoding-filter", "/*"));

            tomcat.start();
            tomcat.getServer().await();

        } catch (Exception e) {
            log.error("=====> Error starting tomcat server.", e);
            throw new ExceptionInInitializerError("Error starting tomcat server.");
        }
    };
}

Там в ServiceLauncher есть в конце строчка

ctx.getBeansOfType(PostStartupInitializer.class).values().forEach(b -> doUnsafe(b::execute));

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

Nagwal ★★★★
()
Ответ на: комментарий от Deleted

не умеет или может это сделано специально чтобы потом не было пятничных конфигураций которые глючат в зависимости от порядка jar в classpath?

У всех видимо свои детские травмы. Тебе вот со спрингом не повезло, я стандартный jee терпеть не могу еще с тех времен, когда деревья были большими, а ejb - вторыми. Понимаю что в последних версиях скорее всего поправили те давнишние косяки, но пользоваться все равно уже не буду.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

Просто первые примеры, в которых jsf используется - они из довольно давенего проекта, где спринг еще через xml конфигурился. В паре последних я как то переполз на чисто явовоскую конфигурацию, без всякого xml-я, только мелкий .properties файл для того, что не хочется хардкодить в исходник.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

Тебе вот со спрингом не повезло

С чего ты взял? В спринге концептуальные косяки. Не повезти может не с ним а с командой которая на нем песнь ЛММ написала. А с JSF может не повезти да, просто потому что лучше в нее не вляпываться.

А на более строгих IoC труднее написать какуюнить жесть, и проще разобраться.

Deleted
()
Ответ на: комментарий от Deleted

С чего ты взял? В спринге концептуальные косяки. Не повезти может не с ним а с командой которая на нем песнь ЛММ написала.

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

А на более строгих IoC труднее написать какуюнить жесть, и проще разобраться.

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

Для управления транзакциями в голом jdbc (вместо того чтобы взять jdbctemplate + spring-tx), для ручного разбора параметров httpservletrequest (вместо того, чтобы взять sping mvc), для ручного управления правами доступа (вместо того, чтобы написать пару правил для http security).

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

Да нет там никаких концептуальных косяков непреодолимых.

автоскан, этого достаточно.

. И Тысячи проектов на нем - тому подтверждение.

Давай сразу про тысячи мух и милионы любителей борланд делфи.

вместо пары строк конфигурации использовались сотни и сотни строк говнокода своих корявых велосипедов с квадратными колесами.

ты мне вместо системной проблемы приводишь частный случай. Такое ощущение что говнопроектов под спринг ты не видел.

Deleted
()
Ответ на: комментарий от Deleted

автоскан, этого достаточно.

Его а) не заставляет никто использовать и б) он довольно удобен, если его использовать с умом.

Давай сразу про тысячи мух и милионы любителей борланд делфи.

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

ты мне вместо системной проблемы приводишь частный случай. Такое ощущение что говнопроектов под спринг ты не видел.

Я тебе привожу системную проблему и пример ее из личной практики. Проекты на guice (да и вообще любых «легких» фреймворках) имеют свойство обрастать адским количеством либо самописных костылей, либо разношерстных и слабо совместимых библиотек.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

не заставляет никто использовать

оно используется автоматом самим спрингом

он довольно удобен, если его использовать с умом.

Ты путаешь ум и hello world

Я тебе привожу системную проблему

говнопроект != системная проблема

Проекты имеют свойство обрастать адским количеством либо самописных костылей, либо разношерстных и слабо совместимых библиотек.

Пофиксил. В спринге тупо засунуть acl в jpa == жопа. И так там везде.

Deleted
()

Возможно уже все объяснили, но сунусь еще и я.
Tomcat - контейнер сервлетов и только сервлетов. Он не поддерживает спецификации JEE, а JSF как раз является частью спецификации JEE. Тебе нужен Glassfish, Wildfly, TomEE.
Spring нужен, web намного приятнее делать именно с его помощью.

matroskin
()
Ответ на: комментарий от Deleted

оно используется автоматом самим спрингом

Оно вообще то используется, только если его включить. И, кстати, выключено по умолчанию.

Ты путаешь ум и hello world

Нет, не путаю. Он вполне применим и в довольно больших проектах, если не натравливать его злобно на com.company.* а четко прописать - где и что искать.

говнопроект != системная проблема

Я не один такой проект к сожалению видел. Так что проблема.

В спринге тупо засунуть acl в jpa == жопа. И так там везде.

Ты хочешь очень странного.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

Оно вообще то используется, только если его включить. И, кстати, выключено по умолчанию.

Мдя, ты спринг то хоть юзал?

если не натравливать его злобно на com.company.* а четко прописать - где и что искать.

Опа, прозреваю что ты видел говнопроекты на спринге! И не один, «так что проблема» ©.

Ты хочешь очень странного.

Рулить ACL это странно?

Deleted
()
Ответ на: комментарий от Deleted

Мдя, ты спринг то хоть юзал?

Нет блин, только во влажных мечтах видел. А теперь расскажи мне, как он себя ведет, если ему не указать аннотацию @ComponentScan в ява-конфиге или <context:component-scan /> в xml-e.

Рулить ACL это странно?

Нет, но куда ты его хочешь просунуть в jpa слое я так и не понял.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

А теперь расскажи мне, как он себя ведет, если ему не указать аннотацию @ComponentScan

Как-то так:

http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/a...

Нет, но куда ты его хочешь просунуть в jpa слое я так и не понял.

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

Deleted
()
Ответ на: комментарий от Deleted

Как-то так

Ну так не используй, тебя кто то заставляет?

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

Ты хочешь, чтобы спринг телепатически угадывал - как ты устроил контроль доступа к объектам и твою структуру ACL-ей?

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

Ну так не используй, тебя кто то заставляет?

Проще не использовать спринг чем использовать его но не использовать boot


Ты хочешь, чтобы спринг телепатически угадывал - как ты устроил контроль доступа к объектам и твою структуру ACL-ей?

обана, да ты о spring-security-acl слышишь впервые

Deleted
()
Ответ на: комментарий от Deleted

Проще не использовать спринг чем использовать его но не использовать boot

Я там выше по треду пример проекта целого кидал, без boot. Вполне удобно.

обана, да ты о spring-security-acl слышишь впервые

Не нужно было, вот и не слышал. Я даже с самим jpa никогда не работал, кроме тестовых проектов на посмотреть. Когда то давно, лет так 5-6 назад, использовал хибернейт в голом виде, без всяких оберток. Все последние проекты были либо на ручном sql, максимум с jdbc template, либо вообще на nosql. И там никакой стандартный acl фреймворк не подошел бы, все равно руками запросы писать.

Nagwal ★★★★
()
Последнее исправление: Nagwal (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.