大家好! 对于上下文,我正在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
如果有人需要更多信息或代码或登录到此,那么我非常乐于澄清。谢谢大家的宝贵时间。
答案 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