Неверный тип в пуле констант после горячей замены кода с использованием DCEVM - PullRequest
0 голосов
/ 23 октября 2018

Привет всем!Для контекста я работаю над простым весенним проектом в intelliJ, чтобы настроить его на HotswapAgent с использованием DCEVM [ 8u181 build 2 ] вместе с совместимым JDK [ 8u181 ] на сервере приложений Payara 5.0.

Пожалуйста, не забывайте меня в следующих нескольких фрагментах кода и моем правдоподобном объяснении того, что происходит, и это не вопрос синтаксиса Spring MVCили это работает.

Это пример кода, который я тестирую на Hotswapping [Не встроенный в JVM, но с использованием DCEVM] и HotswapAgent [ 1.3.0 ]

HelloWorldController.java

@Controller
public class HelloWorldController {



 @Autowired HelloService helloService;



@RequestMapping("/hello")
public String hello(
        @RequestParam(value = "name", required = false, defaultValue = "World") String name,
        Model model) {


    model.addAttribute("name", name);
    System.out.println( helloService.sayHello() );

    return "helloworld";
}

Я не хочу включать код для helloService, так как это может привести к переполнению этого поста.

HelloService.sayHello () просто генерирует наиболее существенный Hello World в консоли

Как вы можете видеть выше, автоматическое подключение включено и выполняет правильную функцию (сказано выше).

После этогоЯ закомментирую аннотацию Autowired и вызов функции, и это дает мне сообщение об ошибке:

org.springframework.web.util.NestedServletException: Handler dispatch     failed; nested exception is java.lang.annotation.AnnotationFormatError: java.lang.IllegalArgumentException: Wrong type at constant pool index

Фокус на:

java.lang.IllegalArgumentException: Wrong type at constant pool index

Я отладилприложение и обнаружил, что IllegalArgumentException возникла, когда AnnotationParser анализировал аннотации класса Spring Controller из константного пула и членов (одной из аннотации, которая является 'типом' аннотации) не былоисправить, когда оно было взято из константного пула класса.

Так что, насколько мне известно, горячее развертывание выполняется неправильно (хотя HotswapAgent говорит, что оно перезагрузило класс на сервере Payara) или что-то не так с коммуникацией JVM или JDK, и я говорю это потому, чтокогда я делаю обратное, это комментирование, автоматическое подключение, затем горячее развертывание и запуск, поэтому я получаю исключение нулевого указателя.

Примечание: только для дополнительной информации

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException

Если кому-то понадобится дополнительная информация, код или информация об этом, я буду более чем рад уточнить.Всем спасибо за уделенное время.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Ну, это было странно решить, но это не связано с версией JDK или DCEVM, а с сервлетом-диспетчером Spring.

Мой сервлет-диспетчер отсутствовал:

<annotation-driven />

Именно поэтому он не смог зарегистрировать класс контроллера и вызвал нежелательное поведение.Также отсутствовали добавленные XML-схемы.

xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"

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

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:context="http://www.springframework.org/schema/context"
             xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <annotation-driven />

    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>

    <context:component-scan base-package="com.test" />
    </beans:beans>
0 голосов
/ 23 октября 2018

Политика хранения Autowire: @Retention (RetentionPolicy.RUNTIME).

Согласно спецификации JVM аннотация должна быть доступна в двоичном виде.(Ссылка: https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6.4.2)

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

Существует похожая открытая проблема с hotswapagent: https://github.com/HotswapProjects/HotswapAgent/issues/256

...