Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我们是否应该记录HTTP 400';s_Java_Rest_Spring Mvc_Model View Controller_Error Handling - Fatal编程技术网

Java 我们是否应该记录HTTP 400';s

Java 我们是否应该记录HTTP 400';s,java,rest,spring-mvc,model-view-controller,error-handling,Java,Rest,Spring Mvc,Model View Controller,Error Handling,在用Java实现的restful服务中,当出现服务器端错误时,必须记录堆栈跟踪,以便以后进行诊断,并返回相应的HTTP 500代码之一 但是400的呢?此类示例包括无效输入、格式错误的JSON/XML、身份验证失败、未找到资源等。显然,我们需要记录错误消息本身,但堆栈跟踪又如何?是否有人记录了这些类型的堆栈跟踪,并发现它们很有用,甚至是必不可少的 已编辑: 例如(不限于此例外情况): 仅记录异常本身: org.springframework.http.converter.HttpMessageN

在用Java实现的restful服务中,当出现服务器端错误时,必须记录堆栈跟踪,以便以后进行诊断,并返回相应的HTTP 500代码之一

但是400的呢?此类示例包括无效输入、格式错误的JSON/XML、身份验证失败、未找到资源等。显然,我们需要记录错误消息本身,但堆栈跟踪又如何?是否有人记录了这些类型的堆栈跟踪,并发现它们很有用,甚至是必不可少的

已编辑: 例如(不限于此例外情况):

仅记录异常本身:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field "foo" (class someClass), not marked as ignorable (1 known property: "bar")
 at [Source: someClass; line: 14, column: 20] (through reference chain: someClass["foo"]->someClass["bar"]->someClass["bar2"]); nested exception is com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "foo" (class someClass), not marked as ignorable (1 known property: "bar")
 at [Source: someClass; line: 14, column: 20] (through reference chain: someClass["foo"]->someClass["bar"]->someClass["bar2"])
记录堆栈跟踪:

at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:181) ~[spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:173) ~[spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:143) ~[spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:180) ~[spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:95) ~[spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) ~[spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157) ~[spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124) ~[spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) ~[spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685) ~[spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) ~[spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919) ~[spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851) ~[spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) ~[spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855) ~[spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ~[servlet-api-2.5.jar:2.5]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) ~[spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65) ~[spring-test-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) ~[servlet-api-2.5.jar:2.5]
at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:168) ~[spring-test-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:136) [spring-test-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) [spring-security-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) [spring-security-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) [spring-security-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) [spring-security-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) [spring-security-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]

最好自己记录错误。此信息可能有用-即,最好知道发生了什么类型的客户端故障。这可以帮助您改进服务文档或API,使客户端更容易使用


至于具体的堆栈跟踪。这可能不会有用。您通常知道故障点(即web服务的入口点)。因此,对于大多数故障,您可能会得到相同的堆栈跟踪。尽管记录这一点也没有坏处。

最好自己记录错误。此信息可能有用-即,最好知道发生了什么类型的客户端故障。这可以帮助您改进服务文档或API,使客户端更容易使用


至于具体的堆栈跟踪。这可能不会有用。您通常知道故障点(即web服务的入口点)。因此,对于大多数故障,您可能会得到相同的堆栈跟踪。尽管记录这一点也没有坏处。

当您不知道错误来自何处时,需要堆栈跟踪。如果您打算故意用400拒绝输入时自己故意记录错误,您可以添加一些东西,例如序列号,以便您可以找到错误的来源,而不是整个堆栈跟踪,在这种情况下,这实际上只是浪费空间。

当您不知道错误来自何处时,需要堆栈跟踪。如果您打算故意用400拒绝输入时自己故意记录错误,您可以添加一些东西,例如序列号,以便您可以找到错误的来源,而不是整个堆栈跟踪,在这种情况下,这真的只是浪费空间。

我认为最好尽可能多地获取导致异常的上下文并记录消息。不过,在处理复杂的代码路径时,Stacktraces肯定会有所帮助。如果有的话,我只会将它们记录在比默认值更低的级别,以便在必要时打开/关闭它们。

我认为,最好尽可能多地了解导致异常的上下文并记录消息。不过,在处理复杂的代码路径时,Stacktraces肯定会有所帮助。如果有的话,我只会将它们记录在比默认值更低的级别,以便在必要时打开/关闭它们。

我会说“不”,完整堆栈跟踪对“400”错误没有帮助,这通常意味着请求有问题,而不是服务器有问题。有帮助的是尽可能多地记录有关违规请求的信息:源IP和端口、登录用户(如果有)、违规数据、部分解码的违规数据、其他会话变量

我会说“不”,完整堆栈跟踪对“400”错误没有帮助,这通常意味着请求有问题,而不是服务器有问题。有帮助的是尽可能多地记录有关违规请求的信息:源IP和端口、登录用户(如果有)、违规数据、部分解码的违规数据、其他会话变量

这些是什么类型的堆栈跟踪?例如,您试图反序列化JSON输入,但没有成功?我提供了一个示例。由于这是JSON,您可能希望在反序列化之前使用JSON模式对其进行验证;这将允许没有反序列化错误,或者至少大大减少它们的数量。这些是什么类型的堆栈跟踪?例如,您试图反序列化JSON输入,但没有成功?我提供了一个示例。由于这是JSON,您可能希望在反序列化之前使用JSON模式对其进行验证;这将允许没有反序列化错误,或者至少大大减少它们的数量