我试图反序列化来自 Javascript UI 的 JSON 对象,但我不断收到 400 -“客户端发送的请求在语法上不正确”错误。请注意,我知道 REST 服务可以工作,因为如果我对 JSON 进行硬编码,我可以成功地使用该服务,但现在我正试图从一个实际的 JS 对象生成 JSON。
Spring 是否生成可以帮助解决此问题的日志消息?如果是这样,那么我该如何设置呢?
我试图反序列化来自 Javascript UI 的 JSON 对象,但我不断收到 400 -“客户端发送的请求在语法上不正确”错误。请注意,我知道 REST 服务可以工作,因为如果我对 JSON 进行硬编码,我可以成功地使用该服务,但现在我正试图从一个实际的 JS 对象生成 JSON。
Spring 是否生成可以帮助解决此问题的日志消息?如果是这样,那么我该如何设置呢?
您可以将自己的日志过滤器添加到处理链中。使用 spring boot 只需提供以下示例:
import javax.servlet.Filter;
...
@Configuration / @SpringBootApplication
class Something {
@Bean
public Filter loggingFilter(){
return new AbstractRequestLoggingFilter() {
private final Logger log = LoggerFactory
.getLogger(Something.class);
{
setIncludeClientInfo(true);
setIncludeQueryString(true);
setIncludePayload(true);
}
@Override
protected void beforeRequest(HttpServletRequest request, String message) {
// not needed
}
@Override
protected void afterRequest(HttpServletRequest request, String message) {
log.info(message);
}
};
}
结果类似于
{timestamp and such} : After request [uri=/v1/thing/1007?null;client=127.0.0.1;payload= {
"name": "test7"
]
和
{
"name": "test7"
成为畸形的身体。这不是最好的过滤器,因为它忽略了有用的信息,例如 http 方法(POST、GET、..)请求所用的时间、响应......但是如果你查看它的源代码,你可以很容易地写一个更好的,以满足您的需求。特别是因为ContentCachingRequestWrapper
并ContentCachingResponseWrapper
允许您非常轻松地获得请求和响应的副本。
除了 servlet 过滤器之外,您还可以添加HandlerInterceptor
类似https://stackoverflow.com/a/28022330 - 在那里您可以访问 SpringMVC 的特定详细信息,但如果不使用它们就无法访问请求和响应内容(比较https://stackoverflow. com/a/2171633)