The server encountered an internal error that prevented it from fulfilling this request的一种解决办法[通俗易懂]

500状态码,问题出现的情况多样,建议根据Exception信息分析,进行debug断点调试排查具体原因

大家好,又见面了,我是你们的朋友全栈君。

一个异常引起的乌龙,HTTPStatus500问题的一种场景及解决办法

一、前言

    这是我在编写服务器响应判断用户数据时遇到的问题,这只是   The server encountered an internal error that prevented it from fulfilling this request  问题的一种情况,具体错误如下图所示:

The server encountered an internal error that prevented it from fulfilling this request的一种解决办法[通俗易懂]

二、问题描述

    我在设置某一属性  grade  时,设置为  int<11>  。在测试数据时,表单提交数据超出原设定范围,所引起的异常。

2-1 问题解决的方法

    对异常捕获,仅仅捕获了 SQLException,导致其他异常出现时,被抛出。

try{
    // ...
} catch(SQLException e) {
    e.printStackTrace();
}

捕获异常 Exception 即可

try{
    // ...
} catch(Exception e) {
    e.printStackTrace();
}

2-2 问题出现与解决

    在输入信息栏输入正确的信息,会给出正确的提示    

The server encountered an internal error that prevented it from fulfilling this request的一种解决办法[通俗易懂]

    处理后正确的响应结果如右图所示

The server encountered an internal error that prevented it from fulfilling this request的一种解决办法[通俗易懂]

三、问题解决

3-1 解决思路一

    其实问题的解决方法就是规范化开发,对填写信息的文本域填写的内容动态的监控,定义可输入的内容为数字,大小写英文,不允许输入特殊字符等控制。比如注册用户时填写用户 ID 时可通过 Ajax 动态获取后台数据,验证该 ID 是否已存在,若存在在注册页面则提示该 ID 已被注册

3-2 解决思路二

    此处我使用的是这个思路来避免该问题。当输入信息错误时,给出了不是我所写的错误处理办法,(我的错误处理办法是,给出提示:系统繁忙,稍后操作!)输入超出原定范围的数据。此处通过捕获抛出的异常进行处理,跳转到一个操作失败页面

         

The server encountered an internal error that prevented it from fulfilling this request的一种解决办法[通俗易懂]

    点击确定后出现的错误如下:

    The server encountered an internal error that prevented it from fulfilling this request的一种解决办法[通俗易懂]

回去检查文件代码,多次修改,发现该问题的解决办法:

修改前的代码:     

The server encountered an internal error that prevented it from fulfilling this request的一种解决办法[通俗易懂]

修改后的代码:(红线已标出)

The server encountered an internal error that prevented it from fulfilling this request的一种解决办法[通俗易懂]

保存修改,重新运行程序,

输入错误的数据,给出了我所设定的处理方法:(下图所示)                          

       

The server encountered an internal error that prevented it from fulfilling this request的一种解决办法[通俗易懂]

The server encountered an internal error that prevented it from fulfilling this request的一种解决办法[通俗易懂]

 

    当出现异常时,认真检查代码的正确性,或许就是一个字符,单词的大小写或拼写错误,都够你调试一下午的。养成良好的代码风格,也是必须的。

四、其他异常补充

4.1 空指针异常(NullPointerException 先看一下)

HTTP Status 500 - Request processing failed; nested exception is 
java.lang.NullPointerException
com.dorm.action.CounsellorAction.counsellorAdd(CounsellorAction.java:123) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:498) 
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452) 
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291) 
...

首先sun.* 或者org.*,都是源码,这些信息不是排查Bug 的重点
一般异常抛出是自己的业务代码有漏洞, 才会触发一系列的信息抛出; 
先找异常信息中的Cause by ... 这是此次异常抛出的原因, 
然后先看异常信息中第一条和当前项目有关业务代码, 
看看信息指定的类的方法某一行为什么抛出空指针异常.
比如上面这个是自己写的CounsellorAction.java  文件中方法counsellorAdd 抛出的异常, 
运行中发现第123 行存在为null 的对象.

4.2 实体类对象转换异常

    此转换对象不能直接强制转换为被转换对象。

HTTP Status 500 - Request processing failed; nested exception is java.lang.ClassCastException:
com.zduod.core.requestentity.RequestUser cannot be cast to com.zduod.core.requestentity.RequestPay

4.3 JSON参数转换异常

    JSON数据传参异常,不能将非数字转换为数字

HTTP Status 500 - Request processing failed; nested exception is com.alibaba.fastjson.JSONException
    ...
root cause
java.lang.NumberFormatException
    java.math.BigDecimal.<init>(BigDecimal.java:494)
    java.math.BigDecimal.<init>(BigDecimal.java:383)
    java.math.BigDecimal.<init>(BigDecimal.java:806)
    com.alibaba.fastjson.util.TypeUtils.castToBigDecimal(TypeUtils.java:194)
    ...

4.4 服务器响应already committed异常

    response 是服务端对客户端请求的一个响应,其中封装了响应头、状态码、内容等;服务端在把response提交到客户端之前,会向缓冲区内写入响应头和状态码,然后将所有内容flush,即将所有缓存输出。这就标志着该次响应已经提交。

    对于当前页面already commitd 已经提交的response 就不能再使用response 执行写操作。

HTTP Status 500 - java.lang.IllegalStateException:Cannot forward a response that is already committd

4.5 前后台交互数据类型不匹配

    后台开发查询用户接口,访问接口

http://localhost:8082/dboot/eouser/queryEOUser,请求JSON数据为

{  "treasureData": "{\"userName\":\"78\",\"userId\":\"2147483648\",\"userPassword\":\"930915\"}"}

    后台响应结果

{
    "timestamp": "2018-07-13T03:05:36.261+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "For input string: \"2147483648\"",
    "path": "/dboot/eouser/queryEOUser"
}

    接口响应错误信息为input输入数据为String类型,后台请求体封装实体类定义属性userId为Integer类型。Integer.MAX_VALUE=2147483647,此处2147483648已经不能作为Integer处理。接口数据改为-2147483648 ~ 2147483647之间的整型数据,重新请求接口,后台正常处理请求并返回结果。

{
    "eoUserList": [
        {
            "userId": 1,
            "userName": "eolinker",
            "userNickName": "eolinker",
            "userPassword": "c0bc7b2052c950c1541692eab1284937"
        }
    ],
    "errorMsg": "查询用户成功!",
    "success": true
}

4.6 Mybatis解析实体属性错误

    此处异常为类型异常;异常信息如下

HTTP Status 500 – Internal Server Error
Type Exception Report
Message Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: 
nested exception is org.apache.ibatis.reflection.ReflectionException: 
There is no getter for property named 'useId' in 'class com.zduod.manage.face.entity.ZddInformation'

    此处是因为mybatis解析属性错误,信息为useId在实体类中无对应的setter()、getter()方法。检查发现请求参数为userId,实体类属性为userId,也存在对应的setter()、getter()方法。

    此处配置文件mapper.xml中错写userId为useId导致解析数据报错,服务器无法处理请求。

<select id="getListByPage" resultMap="BaseResultMap" parameterType="com.zduod.manage.face.entity.ZddInformation">
    select
    <include refid="Base_Column_List" />
    from zdd_information
    <where>
      <if test="informationId != null" >
        and information_id = #{informationId,jdbcType=VARCHAR}
      </if>
      <if test="userId != null" >
        <!--此处写错userId为#{useId,jdbcType=DECIMAL}-->
        and user_id = #{userId,jdbcType=DECIMAL}
      </if>
    </where>
    order by create_time desc
</select>

4.7 请求数据类型语法错误

    此处异常为JSON数据存在格式错误,嵌套异常,语法错误。

HTTP Status 500 – Internal Server Error
Type Exception Report
Message Request processing failed; nested exception is com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 0
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 0

    异常信息是JSON数据存在语法错误,在 { 大括号嵌套时有问题。我这里是前端是通过JSON数据请求后端接口,仔细检查后JSON数据的格式存在如下问题:JSON请求数据中treasureData的value值嵌套的数据没有完全用{}封装。

修改前:
"treasureData": "{"userId":"2018071211901416892","userPayPassword":"100000","cashBalance":"80""
修改后:
"treasureData": "{"userId":"2018071211901416892","userPayPassword":"100000","cashBalance":"80"}"

五、其他说明

500状态码,问题出现的情况多样,请根据Exception信息分析,进行debug断点调试排查具体原因。

你可以把异常信息贴出来,放到技术问答https://ask.csdn.net/去提个问题,会有人帮助你分析处理问题。

你可以把关键异常信息贴在此文评论区,没有异常信息无法确定具体原因。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127860.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ubuntu rootfs_怎么制作ubuntu启动U盘

    Ubuntu rootfs_怎么制作ubuntu启动U盘制作ubunturootfs下载base镜像:http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.1/release/解压:tar-zxfubuntu-xx-base-amd64.tar.gz-C./ubuntu-rootfs/apt-getinstallqemu-user-staticcp/usr/bin/qemu-amd64…

    2022年10月7日
  • DB2 递归查询_oracle递归查询所有子节点

    DB2 递归查询_oracle递归查询所有子节点以父子节点定义的表数据递归查询:DB2 递归查询WITH temp(id,parentid,level)    AS   ( SELECT id,parentid,0   FROM AMIS_WF_NODE WHERE parentid = ‘4028e48146a3c33d0146a3cd9e860022’  UNION ALL   SELECT b.id,b.pare

    2022年10月27日
  • 国产安全加固操作系统(安全可靠应用替代)

    据国家信息安全漏洞共享平台(CNVD)统计数据,2016年我国共收录通用软硬件漏洞10822个,漏洞来源涵盖了众多知名的国外厂商。应用软件的不安全性对我国信息技术发展产生了重大威胁,近年来我国频繁发布信息安全相关政策,鼓励安全可靠技术和产业生态发展,以应对这种局面。安可产业要实现技术自主可控,需要在四个层面逐步实现:基础硬件设施,如芯片、服务器、存储、交换机、路由器;底层…

    2022年4月15日
  • 深度学习之pix2pix原理解析「建议收藏」

    今天我来给大家介绍一下基于CGAN的pix2pix模型,给大家简单讲解一下pix2pix的原理。这里我简单给大家CGAN,我用这张图给大家介绍CGAN的原理:CGAN和传统的GAN不同,传统GAN的生成器Generator只是单纯地传入一个随机噪声从而生成一张图片,那么CGAN和传统的GAN有所不同。CGAN的生成器不再只是一个随机噪声,而是传入一张图片z和一个控制条件y去生成一张假的图片…

    2022年4月10日
  • 多线程CreateThread函数的用法

    多线程CreateThread函数的用法CreateThread当使用CreateProcess调用时,系统将创建一个进程和一个主线程。CreateThread将在主线程的基础上创建一个新线程,大致做如下步骤:1在内核对象中分配一个线程标

    2022年7月4日
  • BigDecimal类型 比较大小的方法[通俗易懂]

    BigDecimal类型 比较大小的方法[通俗易懂]1.转成intBigDecimalb1=newBigDecimal(“-121454125453.145”);if(b1.intValue()<0){ System.out.println(“金额为负数!”); System.out.println(b1);}2.compareTo方法结果是:-1:小于;0:等于;1:大于;BigDecimalb1=newBigDecimal(“-121454125453.145”);if(b1.compar

    2022年7月14日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号