我正在处理一个应用程序,如果在请求中发送了无效的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,它捕获了工作正常的ConstraintViolationException。

我还尝试了互联网上建议的几种不同的例外情况,仅举几例

JsonProcessingException
BadRequestException
JsonParseException
InvalidFormatException
ConstraintDeclarationException


但是,在这种情况下,以上所有异常似乎均无效。有谁知道应将哪个异常与ExceptionMapper结合使用以捕获此类情况。
而且,我猜可能有多个相互并行运行的ExceptionMapper实现。如果我错了,请更正。

编辑:这是我的意思,这是无效的JSON有效负载,请在校验和之前查找缺少的逗号

{
    "payload": {
        "name":"rachel",
        "employeeid":"23443"
    }
    "checksum":""
}


球衣v2.22.1
Spring v4.2.4-RELEASE

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

我也尝试使用RuntimeException,Exception和IOException,但是ExceptionMapper也不适用于它们。我猜这需要一个特定的异常时间,例如ConstraintViolationException,它正在与另一个ExceptionMapper一起使用,并且工作正常。

web.xml的某些部分

            jersey.config.beanValidation.enableOutputValidationErrorEntity.server
            真正
        
        
            jersey.config.server.disableMoxyJson
            真正

最佳答案

最初,我为Json Parsing注册了JacksonFeature.class,该类使用自己的ExceptionMapper进行JsonParseException。

我将其更改为JacksonJaxbJsonProvider.class。

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

不得不改变某些依赖!

07-27 21:06