错误javax.servlet.ServletException: Servlet.init() for servlet com.hank.controller.UserLogin threw exception的解决:

背景
在写Spring的时候init()方法脑热写出来的错误:
浏览器错误提示:

错误日志:
exception
javax.servlet.ServletException: Servlet.init() for servlet com.hank.controller.UserLogin threw exception
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
org.apache.coyote.AbstractProtocolAbstractConnectionHandler.process(AbstractProtocol.java:637)org.apache.tomcat.util.net.JIoEndpointAbstractConnectionHandler.process(AbstractProtocol.java:637) org.apache.tomcat.util.net.JIoEndpointAbstractConnectionHandler.process(AbstractProtocol.java:637)org.apache.tomcat.util.net.JIoEndpointSocketProcessor.run(JIoEndpoint.java:318)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutorWorker.run(ThreadPoolExecutor.java:624)org.apache.tomcat.util.threads.TaskThreadWorker.run(ThreadPoolExecutor.java:624) org.apache.tomcat.util.threads.TaskThreadWorker.run(ThreadPoolExecutor.java:624)org.apache.tomcat.util.threads.TaskThreadWrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:748)
root cause

java.lang.ClassCastException: com.sun.proxy.Proxy127 cannot be cast to com.hank.service.Imp.UserServiceImp
com.hank.controller.UserLogin.init(UserLogin.java:29)
javax.servlet.GenericServlet.init(GenericServlet.java:158)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
org.apache.coyote.AbstractProtocolAbstractConnectionHandler.process(AbstractProtocol.java:637)
org.apache.tomcat.util.net.JIoEndpointSocketProcessor.run(JIoEndpoint.java:318)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutorWorker.run(ThreadPoolExecutor.java:624)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:748)

错误代码:

  ApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");userService = (UserServiceImp) ac.getBean("userservice");

错误原因分析:
因为aop底层默认是jdk动态代理的方式,而jdk动态代理是基于接口来实现的。生成的代理对象和真实对象的关系是实现一样的方法接口的平级关系。对于平级之间的强转这是很显然是错误的。
解决方案1
把生成的代理对象修改为强转为接口使用接口来获得代理对象的引用。

    private UserService userService;@Overridepublic void init() throws ServletException {//        ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());ApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");userService = (UserService) ac.getBean("userservice");

解决方案2
开启aop的cglib动态代理方式:因为cglib动态代理是基于继承的方式来实现获得代理对象,因此获得代理对象和真实对象的关系是继承关系。因此可以强转。

开启步骤:

  1. 导入cglib的jar:
    .

    2.在s’pring的配置开启cglib动态代理

<!--    开启cjlib代理  基于继承--><aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

总结aop底层两种代理方式:
1、jdk动态代理
原理:jdk动态代理基于接口的代理方式,动态生成的代理对象和真实对象实现同一接口。调用JDK官方的类文件获取动态生产的代理对象。


public class Myjdk implements InvocationHandler {//实现InvocationHandler接口 /*** 参数分析:** Object proxy     代理对象* Method method    代理的方法对象* Object[] args    储存代理方法接受的实参的数组* */@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("扩展前");Student student = new Student();student.show();System.out.println("扩展后");return null;}
}
//        jdk动态代理MyInter myInter = (MyInter) Proxy.newProxyInstance(test.class.getClassLoader(),//类加载器,加载动态生产的代理对象new Class[]{MyInter.class}, //动态生产的代理对象要实现的接口new Myjdk());//动态生成的 代理对象自动调用的扩展代码invocationHandler接口实现的myInter.show();//调用动态生成的代理对象的方法

2、cjlib动态代理
基于继承的方式来动态生成代理对象。需要导入cjlib 的jar,实现MethodInterceptor 接口

import net.sf.cglib.proxy.MethodInterceptor;import java.lang.reflect.Method;public class MyStudent implements MethodInterceptor {/*** 参数分析:** Object o  代理对象* Method method 真实方法对象* Object[] objects 储存了代理方法接收的实参数组* net.sf.cglib.proxy.MethodProxy methodProxy 代理方法对象* */@Overridepublic Object intercept(Object o, Method method, Object[] objects, net.sf.cglib.proxy.MethodProxy methodProxy) throws Throwable {System.out.println("cglib代理前");methodProxy.invokeSuper(o,objects);//使用反射System.out.println("cglib代理后");return null;}
}

Cglib调用:


import com.aop6_cglib.cglib.MyStudent;
import com.aop6_cglib.pojo.Student;
import net.sf.cglib.proxy.Enhancer;public class test {public static void main(String[] args) {//cglib代理===》继承Enhancer enhancer = new Enhancer();//创建cglib对象enhancer.setSuperclass(Student.class);//设置生成代理对象所要继承的对象enhancer.setCallback(new MyStudent());//设置生成的代理对象的代理方法所执行的代码Student o = (Student) enhancer.create();//生成代理对象o.show();}
}

博主温馨提示:
如果你想练习这个层实现,导包别导错了。
jdk上面案例代码的包路径:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

cglib上面案例代码的包路径:
import net.sf.cglib.proxy.MethodInterceptor;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;

现在因为一些缘故,导致几个月说的Java日笔记总结不能按时发布。但是以后博主我以后会找时间补上javase的笔记。如果大家觉得有帮助就关注一下博主吧。

错误javax.servlet.ServletException: Servlet.init() for servlet com.hank.controller.UserLogin threw exc相关推荐

  1. javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/el/ELResolver错误解决办法...

    错误如下,不知道是不是遇到鬼了,之前好好的,装了myeclipse以后出错了(说实话,myeclipse用的很不爽,感觉netbeans更好用些) HTTP Status 500 - type Exc ...

  2. [Tomcat,Servlet]解决罕见情况导致的错误javax.servlet.ServletException: Error instantiating servlet class

    先说一下Tomcat版本:Tomcat 8.5 1,错误表征情况:javax.servlet.ServletException: Error instantiating servlet class X ...

  3. 造成javax.servlet.ServletException: Could not resolve view with name的各种原因及解决方法

    报错完成信息: javax.servlet.ServletException: Could not resolve view with name '/lose/index' in servlet wi ...

  4. 无法访问javax.servlet.ServletException

    使用Idea CE 创建了一个基于 Maven 构建的 Spring Boot 项目,在打包的时候提示: 无法访问javax.servlet.ServletException 完整错误信息: [ERR ...

  5. HTTP Status 500 - javax.servlet.ServletException: java.lang.OutOfMemoryError: PermGen space

    详细错误信息 HTTP Status 500 - javax.servlet.ServletException: java.lang.OutOfMemoryError: PermGen spacety ...

  6. HTTP Status 500 - javax.servlet.ServletException: File [/head.jsp] not found

    完整错误信息 HTTP Status 500 - javax.servlet.ServletException: File [/head.jsp] not found type Exception r ...

  7. 深圳宝安图书馆官网错误 HTTP Status 500 - Servlet.init() for servlet spring threw exception...

    停留了一段时间没有动 打开https://www.balib.cn/balib/category/152 *********************************************** ...

  8. javax.servlet.ServletException: java.lang.NoSuchMethodError 解决方法解决办法

    最近在给客户做一个项目,由于修改了一个字段的类型,本地测试都没有问题,但是服务器上一部分是正确的,一部分不正确,同样的一个实体类的一个字段.报错信息入下: 解决办法: 1.进入你tomcat安装目录: ...

  9. javax.servlet.ServletException: File quot;/.jspquot; not found

    问题: javax.servlet.ServletException: File "/.jsp" not found 来源于代码: @RequestMapping(value=&q ...

最新文章

  1. CCTextFieldTTF 与 5种常用CCMenuItem
  2. MPB:上海交大肖湘组分享基于基因芯片的海洋微生物转录组学分析技术
  3. nodejs-函数路由
  4. 翻译:WebApi 认证--用户认证Oauth解析
  5. 【推荐系统】基于用户的协同过滤算法
  6. e文件怎么打开_win10电脑怎么打开ai文件
  7. Python获取当前目录和上级目录
  8. [转]notepad++ java编码,输出中文字符时,编译出错
  9. html嵌入原始数据,如何用html和javascript显示原始图像数据?
  10. 【Swift学习】Swift编程之旅(一)
  11. 离线或在线加载pytorch、mmdetection预训练模型vgg、resnet、alexnet等
  12. oracle给日期加特定天数,oracle按照日期求连续天数的数据sql
  13. 开源经济模型 MAKRO
  14. 陈皓:不灌鸡汤,说真的年龄渐长,技术人的发展之路该怎么走?
  15. javaint接收float_Java Float intValue()用法及代码示例
  16. springboot的底层注解【详细】
  17. itextpdf查找关键字坐标,以及在特定位置添加文字
  18. 2017 年终总结 --- 忙碌而又颇有意义的一年
  19. 华南理工大学计算机科学与工程学院篡改,疑篡改研究生复试成绩!华工四人被停职接受调查...
  20. 计算机网上培训6,wordexcel计算机基础培训6.pptx

热门文章

  1. 郑州大学计算机硕士分数线,2021郑州大学考研复试线:热门专业超过400分,机械类专业仅263分...
  2. execve系统调用
  3. sublimeText3配置_首选项-设置-用户
  4. 《C++Primer》第二章-变量和基本类型-学习笔记(1)
  5. Mac OS编译C++库(XCode)
  6. Python游戏制作(一)
  7. VUE环境搭建和项目创建-win平台
  8. 看透这些才能赢,句句经典
  9. [企业微信通知系列]Jenkins发布后自动通知
  10. 最新版SDWebImage的使用 -- 推荐 - 高效