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/去提个问题,会有人帮助你分析处理问题。

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • mysql去重查询groupby「建议收藏」

    mysql去重查询groupby「建议收藏」一、Dubbo是什么?Dubbo是阿里巴巴开源的基于Java的高性能RPC(一种远程调用)分布式服务框架(SOA),致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。二、为什么要用Dubbo?因为是阿里开源项目,国内很多互联网公司都在用,已经经过很多线上考验。内部使用了Netty、Zookeeper,保证了高性能高可用性。1、使用Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场

    2022年10月30日
  • 推荐系统中TopN与kNN的区别

    推荐系统中TopN与kNN的区别

  • Could not find a version that satisfies the requirement tensorflow问题汇总+解决!!!

    Could not find a version that satisfies the requirement tensorflow问题汇总+解决!!!前言:极力推荐使用Anaconda——————————————————————————一般报错就是:问题一CouldnotfetchURLhttps://pypi.python.org/simple/….然后就是:问题二Couldnotfindaver…

  • Android 11 应用兼容性适配,看这篇就够了

    Android 11 应用兼容性适配,看这篇就够了本文档基于谷歌Android11DeveloperPreview4(DP4)版本的变更输出一、兼容性调试工具Android11引入了新的工具,用于针对最新版平台中的行为变更来测试和调试应用。这些工具属于新的兼容性框架的一部分,可让应用开发者单独开启和关闭各项变更。有了这种灵活性,您可以关闭单项变更,然后继续针对平台中的其他变更测试应用;也可以每次单独针对一项行为变更测试应用。不管是影响所有应用的行为变更还是只影响以Android11为目标平台的应用的行为变更,您都可以随意开启或关

  • spring boot拦截器和过滤器_java拦截器的作用

    spring boot拦截器和过滤器_java拦截器的作用SpringMVC中有两种很普遍的AOP实现:1.过滤器(Filter)2.拦截器(Interceptor)首先说一下两者之间的区别:过滤器和拦截器非常相似,但是它们有很大的区别a.最简单明了的区别就是过滤器可以修改request,而拦截器不能b.过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境c.拦截器可以调用IOC容器中的各种依赖,而过滤器不能d.过滤器只能在请求的前后使用,而拦截器可以详细到每个方法一、HandlerInterc

  • eclipse自动补全不生效解决方法

    eclipse自动补全不生效解决方法eclipse有时候设置了自动补全,但明明设置了自动补全却没生效的解决办法,按照图片上标注序号一步步进入Advanced页面后,勾选第四步的三项选项即可,重新生效,如下…

发表回复

您的电子邮箱地址不会被公开。

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