2016-08-17 1 views
0

В моем приложении Grails 2.3.7 отсутствует контекст приложения для ссылок в конкретном сценарии. Пока я развиваюсь, все в порядке. Когда я разворачиваю приложение на Tomcat 8 и запускаю его с dbCreate в источнике данных create или create-drop, все работает нормально. Но когда я перезапускаю Tomcat (или передислоцирую) и dbCreate в datasource, установленном в none, ссылки в приложении генерируются без контекста приложения. Я использую <g:link controller="controller" action="action">Link Text</g:link> для создания ссылок, в развитии и при использовании dbCreate="create" ссылки генерируются в /application/controller/action, но при использовании dbCreate="none" после перезапуска ссылки генерируются /controller/action, то application часть отсутствует, и, таким образом, цель ссылки не найден. Для таких активов, как css-файлы, правильные ссылки генерируются правильно, включая часть application. Я попытался установить grails.app.context и grails.serverURL в Config.groovy, но безуспешно. Я был бы благодарен за любой намек на решение этой проблемы. (Поиск по SO просто возвращает вопросы в обратном направлении, где люди спрашивают, как опустить часть приложения в ссылку, это не то, что я хочу.)В приложении Grails отсутствует контекст приложения в ссылках после повторного развертывания

Обновление: похоже, не связано с tomcat, У меня такое же поведение при работе с grails run-app.

Обновление: Я могу воспроизвести это с run-app, prod run-app, а также с развернутыми войн, но ошибка не происходит каждый раз, может быть, в течение 2 из 3 стартов веб-приложения, так что я предполагаю, что это может быть вопрос времени с контекстом сервлета, но еще не знаю.

Upadte: Отладка показывает, что в DefaultLinkGeneratorcontextPath равно пустой String, но должен быть либо null, либо «application».

Обновление: Бункер grails grailsLinkCreator был создан при правильном запуске программы. Эта фаза реализована в CachingLinkGenerator, которая называет ее суперкласс DefaultLinkGenerator. Когда-то во время запуска, но после создания и инициализации этого компонента, переменная contextPath в DefaultLinkGenerator установлена ​​в пустую строку, но я не знаю, когда, откуда и почему.

ответ

-1

Я до сих пор не могу исправить (или найти) причину, почему это происходит, но я нашел обходной путь здесь на SO: Grails - override a bean property value in resources.groovy

Соответствующая часть:

Если вы хотите изменить кофейных зерен перед Bootstrap побежал, вы можете использовать BeanPostProcessor [...]

SRC/заводной/yourpkg/CustomBeanPostProcessor:

import org.springframework.beans.factory.config.BeanPostProcessor 

class CustomBeanPostProcessor implements BeanPostProcessor{ 

    @Override 
    Object postProcessBeforeInitialization(Object bean, String beanName) { 
     return bean 
    } 

    @Override 
    Object postProcessAfterInitialization(Object bean, String beanName) { 
     if(beanName == 'messageSource') { 
      bean.setFallbackToSystemLocale = true 
     } 
     return bean 
    } 
} 

resources.groovy:

beans = { 
    customBeanPostProcessor(CustomBeanPostProcessor) 
} 
+0

Ссылка на потенциальное решение всегда приветствуется, но, пожалуйста, [добавить контекст вокруг ссылки] (meta.stackoverflow.com/a/8259, //), так что ваш парень пользователи будут иметь представление о том, что это такое и почему оно есть. Всегда указывайте наиболее значимую часть важной ссылки, если целевой сайт недоступен или постоянно находится в автономном режиме. Примите во внимание, что быть более чем ссылкой на внешний сайт_ является возможной причиной [Почему и как удаляются некоторые ответы?] (// stackoverflow.com/help/deleted-answers). – FrankerZ

+0

@FrankerZ Я отредактировал свой ответ в соответствии с вашим предложением, спасибо за подсказку. – Calon