Java 无效Json字符串的自定义异常映射器

Java 无效Json字符串的自定义异常映射器,java,json,rest,validation,jersey,Java,Json,Rest,Validation,Jersey,我正在处理一个应用程序,我需要为该应用程序构建响应,以防请求中发送无效的JSON负载 当前在服务器端收到的异常消息是意外字符(“”(代码34)):应使用逗号分隔对象条目 在[来源:org.glassfish.jersey.message.internal.ReaderInterceptorExecutor]$UnCloseableInputStream@310db662;第13行第7列] 这就是我努力实现它的方式 import java.util.ArrayList; import java.u

我正在处理一个应用程序,我需要为该应用程序构建响应,以防请求中发送无效的JSON负载

当前在服务器端收到的异常消息是意外字符(“”(代码34)):应使用逗号分隔对象条目 在[来源:org.glassfish.jersey.message.internal.ReaderInterceptorExecutor]$UnCloseableInputStream@310db662;第13行第7列]

这就是我努力实现它的方式

import java.util.ArrayList;
import java.util.List;

import javax.validation.ConstraintDeclarationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@Provider
public class JsonParseExceptionMapper implements ExceptionMapper<JsonProcessingException> {

    private static Logger logger = LogManager.getLogger(JsonParseExceptionMapper.class.getName());

    @Override
    public Response toResponse(final JsonProcessingException ex) {

        System.out.println("inside json parse exception mappper");

        logger.error(messages.toString());
        return Response.status(Response.Status.BAD_REQUEST).entity(messages).type(MediaType.APPLICATION_JSON).build();
    }
}
但是上述异常在这种情况下似乎都不起作用。有没有人知道哪种异常应该与ExceptionMapper一起使用以捕获此类情况。
另外,我想可能有多个ExceptionMapper实现彼此并行运行。如果我错了,请更正

Edit:这就是我所说的无效JSON负载,请在校验和之前查找缺少的逗号

{
    "payload": {
        "name":"rachel",
        "employeeid":"23443"
    }
    "checksum":""
}
泽西2.22.1版
Spring v4.2.4-RELEASE

由于某些原因,我无法对任何帖子发表评论!!!即使编辑窗口有问题,我也看不到任何图标!!

我也尝试过使用RuntimeException、Exception和IOException,但是ExceptionMapper对它们也不起作用。我想它需要一个特定的异常时间,比如ConstraintViolationException,它与另一个ExceptionMapper一起使用,并且这个异常可以正常工作

web.xml的某些部分 jersey.config.beanValidation.enableOutputValidationErrorEntity.server 真的 jersey.config.server.disableMoxyJson 真的

最初我注册了JacksonFeature.class进行Json解析,它使用自己的ExceptionMapper进行JsonParseException

我将其更改为JacksonJaxbJsonProvider.class

我现在可以使用自定义的JsonParseExceptionMapper了


必须更改某些依赖项!!

您在配置中注册了映射器吗?您使用的是什么类型的json解析器?是的,映射器是使用@Provider注册的。我正在使用codehaus并使用spring for DI.Jersey v 2.22.1。对我来说,您提供的代码似乎是正确的(除了缺少对JsonProcessingException的导入,我想这是由于站点上的帖子发生了更改造成的)。您可以尝试捕获IOException,甚至是Exception/RuntimeException,以确保该提供程序被调用。还可以确保它位于
jersey.config.server.provider.classpath
()jersey能够找到映射器,因为它是用@Provider注释的,而且包也被设置为jersey可以查找。我也尝试过使用Exception、RuntimeException和IOException,但它们都不起作用。我使用的是Java 1.8,这与此有关吗…虽然我不认为soDude,你刚刚救了我的命…我使用的是Jersey和嵌入式Jetty,所以我必须这样做:
final ResourceConfig ResourceConfig=new ResourceConfig(JacksonJaxbJsonProvider.class);ResourceConfig.packages(packages);
很高兴知道。愉快的编码。
{
    "payload": {
        "name":"rachel",
        "employeeid":"23443"
    }
    "checksum":""
}