使用DCEVM进行热交换代码后,常量池的类型错误

时间:2018-10-23 15:10:17

标签: java spring jvm hotswap hotswapagent

大家好!              对于上下文,我正在intelliJ中进行一个简单的spring项目,以使用HotswapAgent [ 8u181 build 2 ]和兼容的JDK [ 8u181 < / strong>]在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

正如您在上面看到的那样,自动接线已打开,并且可以正常工作(如上所述)。

此后,我注释掉了自动装配注释和函数调用,这给了我一个错误:

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

我调试了应用程序,发现当DCEVM从常量池中解析Spring Controller类的注释时,引发了IllegalArgumentException。注释)从类的常量池中提取时是不正确的。

因此,据我所知,热部署未正确完成(即使HotswapAgent表示已在Payara Server上重新加载了该类),或者JVM通信或JDK出了点问题,我之所以这样说是因为相反,先注释掉自动装配,然后热部署,然后运行,然后得到一个空指针异常。

注意:仅用于添加信息

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

如果有人需要更多信息或代码或登录到此,那么我非常乐于澄清。谢谢大家的宝贵时间。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这很奇怪,但是与JDK版本或DCEVM无关,而与Spring的调度程序servlet有关。

我的Dispatcher Servlet丢失了:

.find()

这就是为什么它无法注册控制器类并导致不良行为的原因。还缺少添加的XML模式。

loc

仅出于完成目的,或者如果对任何人有帮助,我都会发布完整的调度程序servlet配置。

pandas