- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个 InstantDesrializer
@Slf4j
public class InstantDeserializer extends StdDeserializer<Instant> {
public InstantDeserializer() {
this(null);
}
public InstantDeserializer(Class<?> vc) {
super(vc);
}
@Override
public Instant deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
log.info(node.asText());
TemporalAccessor parse = null;
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(Constants.DATE_TIME_FORMAT).withZone(ZoneOffset.UTC);
try {
parse = dateTimeFormatter.parse(node.asText());
} catch (Exception e) {
e.printStackTrace();
throw new IOException();
}
log.info(Instant.from(parse).toString());
return Instant.from(parse);
}
}
然后在@ControllerAdvice
中对应IOException
@ExceptionHandler(IOException.class)
public ResponseEntity<String> handleIOException(IOException e) {
return ResponseEntity.status(422).build();
}
这在我的 DTO 中:
@NotNull
@JsonDeserialize(using = InstantDeserializer.class)
// @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
private Instant timestamp;
即使取消注释 @DateTimeFormat
,它也不起作用
理想情况下,它应该返回 422 状态。但是,它返回 400。
也许我只是遗漏了一些我无法弄清楚的小东西。
这里建议使用这种方法: Throw custom exception while deserializing the Date field using jackson in java
最佳答案
您的 Controller 方法从未被调用,因为 JSON 正文解析抛出了异常。
您的@ContollerAdvice 未应用,因为未调用 Controller 方法。
您的 handleIOException 方法未被调用,您的 422 状态未应用。
我怀疑这是更详细的情况......
HTTP 请求包含一个 json 正文。
与请求的@RequestMapping 和其他注释相匹配的 Controller 方法将您的 DTO 类的实例作为参数。
Spring 尝试在调用您的控制方法之前反序列化传入的 json 主体。它必须这样做才能传递 DTO 对象。
反序列化使用您的自定义反序列化器,它会抛出 IOException。
此 IOException 发生在之前您的 Controller 方法被调用。事实上,您的 Controller 方法永远不会为此请求调用。
Spring 使用其默认行为处理异常,返回 HTTP 400。Spring 具有非常广泛的 HTTP 400 RFC 7231 概念。
由于永远不会调用您的 Controller 方法,因此永远不会应用@ControllerAdvice,并且您的@ExceptionHandler 不会看到异常。状态未设置为 422。
我为什么相信这个?
我经常从 Spring 中看到这种行为,我认为这是预期的行为。但我还没有找到文档或阅读源代码来确定。
你能做些什么?
您可能不喜欢的一种简单方法是声明您的 Controller 方法以接受几乎永远不会失败的输入,例如 String。
您负责验证和反序列化输入,并决定要返回的状态和消息。
您调用 Jackson 进行反序列化。使用您的@ExceptionHandler 方法。
好处:您可以返回 Jackson 经常有用的解析错误消息的文本。这些可以帮助客户找出他们的 json 被拒绝的原因。
如果 Spring 提供一种更时尚的方法,一个可以子类化的类,一个特殊的注解,我不会感到惊讶。我没有追求那个。
你应该怎么做?
400 与 422 是我不想提起诉讼的案例。根据您的优先级,最好接受 Spring 的约定。
RFC 7231 状态 400
The 400 (Bad Request) status code indicates that the server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).
如果 HTTP 状态码警察找你,你可以指着它说“我认为这个输入是客户端错误。”然后争辩说 422 是不合适的,除非你正在服务 WebDAV只是为了让他们失去平衡。
关于java - 为 Jackson 自定义解串器抛出带有 HTTP 状态代码的自定义异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55214077/
我找不到关于 jackson 的ObjectMapper与其他映射器(例如dozer/mapStruct/modelMapping/etc)之间的区别的任何解释。所有文章都比较了dozer/mapSt
我正在使用Jackson来反序列化Kotlin数据类。我正在使用jackson-kotlin-module,但 jackson 却给我以下错误: Can not construct instance
我正在尝试将包从“com.fasterxml.jackson”重新定位到我自己的包(即“mypackage.com.fasterxml.jackson”),然后在我拥有的另一个 JAR 中使用它。 我
对于JSON对象,Subject: { "permissions":["foo", "bar"], ... } ...我想反序列化为: class Subject { priv
我正在使用 @JsonTypeInfo 和 @JsonSubTypes 来映射基于给定属性的解析子类。这是我想要解析的示例 JSON 的一个人为示例。 { "animals": [ { "
我们正在使用 dropwizard 版本 0.6.3。当我们尝试升级 0.7.0 版本时,我们在服务启动时收到此错误。 线程“main”中的异常 java.lang.VerifyError: clas
我正在尝试实现自定义解串器。因为我只想向默认反序列化器添加功能,所以我尝试在我的自定义反序列化器中存储默认反序列化器:我想使用默认反序列化 json,然后添加其他信息。 我正在尝试使用 BeanDes
我有一个这样的类(class): public class Person { private String name; public String getName(){ return
我有以下 Kotlin 数据类: data class TestObject( val boolField: Boolean, val stringField: Str
使用 Jackson 库,在 Eclipse 4.9.0 版本中出现以下错误 缺少工件 com.fasterxml.jackson.core:jackson-databind:bundle:2.9.6
我试图在我的应用程序中从azure实现keyvault,在为DefaultAzureCredentialBuilder()实现azure-identity:1.5.4 lib后,它会抛出链接错误,如下
我试图在我的应用程序中从azure实现keyvault,在为DefaultAzureCredentialBuilder()实现azure-identity:1.5.4 lib后,它会抛出链接错误,如下
我知道我们可以使用 Jackson MixIn 来重命名属性或忽略属性(参见示例 here )。但是可以添加属性吗? 添加的属性可以是: 一个常数(如版本号) 计算值(例如,如果源类具有 getWid
我有一个在 Wildfly 10 上运行的应用程序,它需要更新版本的 jackson。简单地更新 maven 依赖是行不通的。 Wildflys 自己的版本似乎干扰了... 有人有提示吗? 最佳答案
我在 Tomcat 休息应用程序中运行 Jersey 2.5.1 & Jackson。对于我最初将 POJO 简单地转换为 JSON 的用例,基本设置效果很好。集合很好地转换为 json 数组,如下所
有没有办法告诉 jackson 在序列化过程中忽略那些用非 jackson 注释注释的字段? 例如: @SomeAnnotation private String foo; 我知道有 jackson
我遇到了 jackson 序列化问题, map 中存在空值。显然,这是 Wildfly 9 使用的 Jackson 版本中的一个已知错误 ( https://issues.jboss.org/brow
给定一个像这样的 JSON 映射类: public class Person { @JsonProperty String getName() { ... } @JsonPro
如何让 Jackson 的 XMLMapper 在反序列化时读取根 xml 元素的名称? 我正在将输入 XML 反序列化为通用 Java 类、LinkedHashMap,然后反序列化为 JSON。我想
我对抽象类和 JSON 序列化和反序列化的对象引用有问题。抽象的问题如下所示: 我有一个由节点和边组成的图。每条边连接两个节点。节点可以是红色和绿色的。因此,有一个抽象类Node和两个派生类 RedN
我是一名优秀的程序员,十分优秀!