2016-10-16 7 views
1

Я развернула Grails 3.2.0 WAR на Tomcat 8.5.6 и JDK 1.8.0_91 с простой контроллер, имеющий следующий код:GroovyObject класс не найден на сервере Tomcat 8 с войны Grails 3.2.0

package com.test 

class MailController { 
    static responseFormats = ['json'] 

    def index() { 
     Map headers = (request.headerNames as List).collectEntries { // It fails on this line 
      return [(it): request.getHeader(it)] 
     } 

     println "Incoming email $headers" 
     render status: 200 
    } 
} 

Этот код не за исключением следующего:

Caused by: java.lang.NoClassDefFoundError: groovy/lang/GroovyObject 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642) 
    at groovy.util.ProxyGenerator.instantiateDelegateWithBaseClass(ProxyGenerator.java:225) 
    at groovy.util.ProxyGenerator.instantiateDelegateWithBaseClass(ProxyGenerator.java:193) 
    at groovy.util.ProxyGenerator.instantiateDelegate(ProxyGenerator.java:185) 
    at groovy.util.ProxyGenerator.instantiateDelegate(ProxyGenerator.java:181) 
    at org.grails.web.converters.ConverterUtil.invokeOriginalAsTypeMethod(ConverterUtil.java:161) 
    at org.grails.web.converters.ConvertersExtension.asType(ConvertersExtension.groovy:56) 
    at com.test.MailController.index(MailController.groovy:7) 
    at org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker.invoke(DefaultGrailsControllerClass.java:222) 
    at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:187) 
    at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
    ... 14 common frames omitted 
Caused by: java.lang.ClassNotFoundException: groovy.lang.GroovyObject 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    ... 27 common frames omitted 

Перед созданием файла WAR, я изменил внедренный накотав build.gradle, а также прокомментировал groovy-ant зависимость, связанную с grails-core#10196

Я вижу ответ here но не работал и выше код работает отлично, когда мы бежим через grails run-app.

Update

Я замкнута вниз вопрос. Выполняется только для этой цели request.headerNames as List

ответ

1

Уверен, что проблема связана с использованием "as List". В основном потому, что Grails перезаписывает реализацию asType Groovy, которая делает «как X» синтаксисом принуждения.

Grails делает это, чтобы добавить поддержку таких вещей, как JSON для сортировки известных типов Grails в форматах веб-транспорта. К сожалению, при этом Grails также нарушает любую функцию asType, которую вы, возможно, объявили сами. Или в этом случае сам Groovy уже объявлен для преобразования Перечисления в Список.

Это довольно раздражает, так как Grails эффективно нарушает существующие контракты здесь и заставляет вас модифицировать код восходящего потока, чтобы он мог работать на Grails. Это или свалка Grails, потому что она не играет хорошо с совершенно корректным кодом Groovy.

Я считаю, что замена «как Список» с .asType(List) даже не устранит проблему, поскольку вы все еще вызываете тот же код. В лучшем случае вы можете попробовать .collect([]) {it}. Возможно, нет необходимости добавлять пустой массив в качестве первого аргумента для сбора.

+0

Хмм .. Я не знал об этой проблеме Грайля о перезаписи реализации asType. Это может быть причиной. Хотя я исправил его, используя доступный метод 'toList()' on 'Enumeration', но мне было любопытно, почему он терпит неудачу только в файле WAR. Я должен проверить это. Спасибо за это время! –

 Смежные вопросы

  • Нет связанных вопросов^_^