gpt4 book ai didi

java - 如何处理Java Rest Web服务中错误的JSON数据错误: Jackson JSON Parser Unrecognized token

转载 作者:行者123 更新时间:2023-11-30 02:30:39 25 4
gpt4 key购买 nike

这是我的网络服务,我在其中接收学生对象中的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com