提问者:小点点

自定义 GAE 标准上杰克逊绑定引发的异常


我一直在寻找自定义< code > Jackson bind on < code > GAE 抛出的异常的方法。

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

例如:

@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);
   }    
}

在上面的代码中,如果有效负载命中了回送endpoint

那么响应是

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


共1个答案

匿名用户

为此,您需要注册<code>DeserializationProblemHandler</code>

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);
    }
});

您的异常应该扩展< code > 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来源

相关问题