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

时间:2016-02-27 12:26:45

标签: java json rest validation jersey

我正在处理一个应用程序,如果在请求中发送了无效的JSON有效负载,我需要构建响应。

目前在服务器端收到的异常消息是意外字符('“'(代码34)):期望逗号分隔OBJECT条目  在[来源:org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@310db662; line:13,column: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,请在校验和之前留意缺少的逗号

{
    "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             真正         

1 个答案:

答案 0 :(得分:3)

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

我把它改成了JacksonJaxbJsonProvider.class。

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

必须改变某些依赖关系!!