首页 > 解决方案 > 在 GAE 标准上自定义 jackson bind 抛出的异常

问题描述

我一直在寻找一种方法来自定义Jacksonbind on引发的异常GAE

问题是当我发送一个字符串参数时,API方法期望Integer抛出一个Jackson's InvalidFormatException。我想自定义异常抛出的消息,但我找不到方法。请帮助解决这个问题。

例如:

@Api(
name = "echo",
version = "v1",
namespace =
@ApiNamespace(
    ownerDomain = "echo.example.com",
    ownerName = "echo.example.com",
    packagePath = ""
),
issuers = {
    @ApiIssuer(
        name = "firebase",
        issuer = "https://securetoken.google.com/YOUR-PROJECT-ID",
        jwksUri =
            "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system"
                + ".gserviceaccount.com"
    )
})

public class Echo {
   @ApiMethod(name = "echo")
   public Message echo(Message message, @Named("n") @Nullable Integer n) {
      return doEcho(message, n);
   }    
}

在上面的代码中,如果 echo 端点被有效载荷命中

在此处输入图像描述

那么响应是

在此处输入图像描述

在这种情况下是否可以抛出自定义异常或自定义消息

标签: javagoogle-app-enginejacksonjackson-databind

解决方案


为此,您需要注册DeserializationProblemHandler

ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.addHandler(new DeserializationProblemHandler() {
    @Override
    public Object handleWeirdStringValue(DeserializationContext ctxt, Class<?> targetType, String valueToConvert, String failureMsg) throws IOException {
        System.out.println("Handle parse problem for value = " + valueToConvert);
        throw new CanNotParseJsonException("Can not deserialise " + valueToConvert, null);
    }
});

您的异常应该在其他情况下扩展JsonMappingException,它将被包装。示例异常:

class CanNotParseJsonException extends JsonMappingException {

    public CanNotParseJsonException(String msg, Throwable problem) {
        super(null, msg, problem);
    }
}

看:

  1. 在 Spring 环境中配置一个 Jackson 的 DeserializationProblemHandler
  2. 无法在 Spring Boot 中将 ProblemHandler 设置为 ObjectMapper
  3. Java 源代码

推荐阅读