【问题标题】:com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected tokencom.fasterxml.jackson.databind.exc.MismatchedInputException:意外的令牌
【发布时间】:2018-09-11 17:10:42
【问题描述】:

我正在尝试发布一个用户组:

public UserGroup createUserGroup(UserGroup userGroup) {
    ResponseEntity<UserGroup> userGroupResponseEntity = oauthRestTemplate
            .postForEntity(GROUPS_ENDPOINT, userGroup, UserGroup.class);
    return userGroupResponseEntity.getBody();
}

由于我使用的是@RepositoryRestResource,我必须配置对象映射器:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new Jackson2HalModule());
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
messageConverter.setObjectMapper(objectMapper);
messageConverter.setSupportedMediaTypes(Collections.singletonList(MediaTypes.HAL_JSON));

this.oauthRestTemplate.setMessageConverters(Collections.singletonList(messageConverter));

但是,从上面运行 POST 会抛出我

Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected VALUE_STRING: Expected array or string.
 at [Source: (org.apache.catalina.connector.CoyoteInputStream); line: 1, column: 87] (through reference chain: mahlzeit.api.hibernate.model.UserGroup["voteUntil"])
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) ~[jackson-databind-2.9.4.jar:2.9.4]
    at com.fasterxml.jackson.databind.DeserializationContext.wrongTokenException(DeserializationContext.java:1507) ~[jackson-databind-2.9.4.jar:2.9.4]
    at com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer.deserialize(LocalDateTimeDeserializer.java:138) ~[jackson-datatype-jsr310-2.9.2.jar:2.9.2]
    at com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer.deserialize(LocalDateTimeDeserializer.java:39) ~[jackson-datatype-jsr310-2.9.2.jar:2.9.2]
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127) ~[jackson-databind-2.9.4.jar:2.9.4]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:369) ~[jackson-databind-2.9.4.jar:2.9.4]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159) ~[jackson-databind-2.9.4.jar:2.9.4]
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4001) ~[jackson-databind-2.9.4.jar:2.9.4]
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3072) ~[jackson-databind-2.9.4.jar:2.9.4]
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:235) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE]
    ... 93 common frames omitted

2018-04-02 15:12:52.788 DEBUG 1811 --- [nio-8081-exec-3] o.s.s.w.header.writers.HstsHeaderWriter  : Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@24f17053
2018-04-02 15:12:52.789 DEBUG 1811 --- [nio-8081-exec-3] o.s.s.w.a.ExceptionTranslationFilter     : Chain processed normally
2018-04-02 15:12:52.789 DEBUG 1811 --- [           main] o.s.s.oauth2.client.OAuth2RestTemplate   : POST request for "http://localhost:8081/groups" resulted in 400 (null); invoking error handler
2018-04-02 15:12:52.789 DEBUG 1811 --- [nio-8081-exec-3] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed
org.springframework.web.client.HttpClientErrorException: 400 null
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79)
    at org.springframework.security.oauth2.client.http.OAuth2ErrorHandler.handleError(OAuth2ErrorHandler.java:172)
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:777)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:730)
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.doExecute(OAuth2RestTemplate.java:128)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:686)
    at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:468)

我就是不明白为什么!

【问题讨论】:

  • 一个快速的建议:调试时,不要禁用DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES——它可以隐藏各种问题。在生产中禁用可能是有意义的(但并非总是如此),但在进行故障排除时最好保持打开状态。这可能不是这里的问题,但我见过很多这样的情况,其中隐藏了本来可以解决的简单问题。
  • @StaxMan 谢谢!我非常欢迎这样的建议。我将尝试启用此功能-tbh 我并没有过多考虑它的效果-我只是在关注stackoverflow的答案-我们可以看到不应该做的事情:D
  • @StaxMan 好的,我已经测试过了。问题是这不适用于来自 Spring Data JPA 的 hal+json 格式。我不知道我是否可以解决这个问题,但此时我要么必须启用它,要么为此编写自己的资源类。
  • 在另一个帖子中看到这个answer

标签: spring jackson spring-data spring-data-jpa


【解决方案1】:

对于遇到这种情况的任何人 - 这就是为什么如果您不小心或记住您事先配置的一百万件事,Spring 有时会变得如此令人沮丧。

所以如果你像我一样使用application-test.properties 来配置某些东西,让我们这样说:

# Used to enable ISO format for time data
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

但是已经忘记了这一点,那么您可能要记住,一旦您像我一样设置自定义 ObjectMapper 以使用 Spring Data REST 的 hal+json 输出,此属性就会被忽略端点。因此,您可能需要设置:

objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.registerModule(new JavaTimeModule());

【讨论】:

    猜你喜欢
    • 2018-09-24
    • 1970-01-01
    • 2021-03-19
    • 2016-05-03
    • 2018-04-17
    • 2011-11-21
    • 2016-06-15
    • 2019-10-16
    • 2019-02-01
    相关资源
    最近更新 更多