- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的网络服务,我在其中接收学生对象中的 JSON。
@PUT
@Path("/{stuId}")
@Consumes({MediaType.APPLICATION_JSON})
public Response update( @PathParam("stuId") UUID stuUUID , Student updatedStudentInfo) {
return updateService.update(stuUUID, updatedStudentInfo);
}
这是学生类(class):
public class Student{
private int id;
private String studentName;
private String Address;
@JsonProperty
public int getId() {
return id;
}
@JsonProperty
public void setId(int id) {
this.id = id;
}
@JsonProperty
public String getStudentName() {
return studentName;
}
.
.
.
.
}
它工作正常,但当我通过发送错误的 JSON 数据来测试它时,我无法处理场景。例如,如果我这样做
curl -v ' https://localhost:9803/school/student/29374-345tr-44 ' -X PUT -H '接受:application/json,text/plain,/' -H '我的 API 版本:1' -H '授权:基本' -H '内容类型:application/json;charset= utf-8' --data '{"studentName":"rock","地址":723868764}'
它产生一个错误:
Unrecognized token '723868764': was expecting ('true', 'false' or 'null')
现在我该如何处理这种情况,如果出现一些错误的数据,那么除了我想发送的错误或异常之外,它不应该发回任何错误或异常。
编辑1:
下面我们还可以看到 Java 代码生成的异常
Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'sdfsdfdsfdsf': was expecting ('true', 'false' or 'null') at
[Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@5c6d324d; line: 1, column: 59]
最佳答案
我找到了两种可用的解决方案:
解决方案 1: ExceptionMapper( Jersey )
@Provider
public class ClientExceptionMapper implements ExceptionMapper<Throwable>
{
@Override
public Response toResponse(Throwable ex)
{
return Response
.status(Response.Status.BAD_REQUEST)
.build();
}
}
这里重要的是注释
@provider
我不确定使用注释将扫描配置放入web.xml后是否有必要,但为了安全起见,让我们这样做
<servlet>
<servlet-name>my-servlet</servlet-name>
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
com.myrootpackgae.ws;com.anotherPackage.errorHandling;
</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.scanning.recursive</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
您的 ExceptionMapper 类应位于 Rest Service 的同一包中或位于 Package 层次结构下。
最后但并非最不重要的一点是,我在示例中使用了 Throwable,但您可以特定于任何异常,例如
JsonParseException
JsonMappingException
UnrecognizedPropertyException etc ...
解决方案 2: javax.ws.rs.container.ContainerResponseFilter
public class MyRestAppResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
// Remove StackTrace from all exceptions
Object entity = responseContext.getEntity();
if (entity instanceof Throwable) {
responseContext.setEntity(null);
responseContext.setStatus(Response.Status.BAD_REQUEST.getStatusCode());
}
// TF-246 Prevent caching for privacy reasons
responseContext.getHeaders().add("Cache-Control", "no-cache, no-store, must-revalidate");
responseContext.getHeaders().add("Pragma", "no-cache");
responseContext.getHeaders().add("Expires", "Thu, 01 Jan 1970 01:00:00 CET");
// TF-752 Enable CORS for WkWebView
responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
}
}
请求的事件监听器也可用 RequestEventListener
,它提供 onEvent(RequestEvent)
方法。
我更喜欢使用解决方案#2
关于java - 如何处理Java Rest Web服务中错误的JSON数据错误: Jackson JSON Parser Unrecognized token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44365723/
我想解析一些文本,其中某些字段在大多数情况下都具有结构,但偶尔(由于特殊大小写、拼写错误等)该结构会丢失。 例如常规情况是 Cost: 5,但偶尔会显示 Cost: 5m 或 Cost: 3 + 1
以下有什么区别: parser.setFeature("http://xml.org/sax/features/validation",true); and parser.setFeature("ht
我尝试在 Windows 8.1 上的 Git Bash 客户端中执行 npm install,但收到以下错误: npm WARN optional SKIPPING OPTIONAL DEPENDE
试图理解 evancz/url-parser 模块时,我偶然发现了这种我难以理解的类型声明:( source ) type Parser a b = Parser (State a -> List
我长期使用下面的 TypeScript 和 Vue 预设。它有效,但我还没有理解每个选项,现在要理解它。第一:parser之间有什么区别?和 @typescript-eslint/parser ? p
我正在尝试使用node-sql-parser在nodejs中解析sql查询。 const {Parser} = require('node-sql-parser'); const parser = n
自定义指令中的 ngModelCtrl.$parsers.unshift 和 ngModelCtrl.$parsers.push 之间的确切区别是什么。 当发生对模型生效但对表单本身无效的事情时,我想
我正在寻找 SAX 和 Pull Parser 之间的主要区别。我知道 SAX 解析器非常适合处理大型 XML 文件,因为它不存储 XML 并且只在一个方向上遍历。与 DOM 相比。但我无法找到 SA
我已经按照存档中的说明成功(?)安装了 QJson 库。但是编译器给我这个错误: Undefined reference to QJSon::Parser::Parser(). 我找到了安装库文件的位
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
尝试实现 Cucumber 来进行一些自动化测试。当我使用 junit 运行测试时,出现以下错误 项目路径: src/test/java/ cucumberJava -cucumberjava,ja
我已经阅读了我能找到的所有文档,但是我找不到关于这两个中间件的作用的简单解释。 body-parser 中的body 指的是什么?为什么需要解析正文? Cookie 也类似。我是否更正了 cookie
我在gradle项目中使用Xerces jar,然后在gradle插件中使用该项目的jar:实际上,我正在开发一个gradle插件,其中包含使用gradle项目jar的某些功能的自定义任务;当我尝试运
我正在尝试连接到 Linux 上的 FTP 服务器,当我执行 ftp.listFiles(remote); 时遇到异常 SYST 215 Linux Exception in thread "AW
我有react-app的示例安装,我得到了以下内容 Error: Failed to load parser '@typescript-eslint/parser' declared in '.esl
我在 there 中提到过类似的问题.我正在使用 mvn clean compile site 命令,我的版本是: cobertura.version: 2.5.1 findbugs.version:
我正在 Eclipse 中开发 GWT 应用程序并使用 jdom2 读取一些自定义 xml 属性文件。 在最近的更新之后,我的应用程序现在在尝试读取 xml 文件时失败并出现上述错误。相关堆栈跟踪是:
我正在使用 spring+maven。我正在 tomcat 服务器中部署我的应用程序。当我尝试运行我的应用程序时,突然出现以下错误。 INFO: Starting Servlet Engine: Ap
我在玩dateutil module在 Python 2.7.3 中。我只是想使用: import dateutil dateutil.parser.parse("01-02-2013") 但我得到了
一.入参解析库 argparse 有时候写Python脚本,需要处理入参[-h][-v][-F]...等情况,如果自己来解析的话,会花费很多时间,而且也容易出问题,好在Python有现成的li
我是一名优秀的程序员,十分优秀!