Spring boot 来自Jackson的NPE试图序列化不存在的字段?

Spring boot 来自Jackson的NPE试图序列化不存在的字段?,spring-boot,jackson2,jackson-databind,Spring Boot,Jackson2,Jackson Databind,这是我的简单豆子 @Data @NoArgsConstructor @AllArgsConstructor @Builder public class Foo { private String firstName; private String lastName; public String getFullName(){ return firstName + lastName; } } 当此对象在Spring boot controller中与J

这是我的简单豆子

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Foo {

    private String firstName;
    private String lastName;

    public String getFullName(){
     return firstName + lastName;
    }

}
当此对象在Spring boot controller中与Jackson一起序列化时, 我得到以下错误

j.l.NullPointerException: null
   com.example.foobar.foo.getFullName(Foo.java:28)
  s.r.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java)
  s.r.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  s.r.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  j.l.reflect.Method.invoke(Method.java:498)
  c.f.j.d.s.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:653)
  c.f.j.d.s.s.BeanSerializerBase.serializeFields(BeanSerializerBase.java:690)..
  28 common frames omitted\nWrapped by: c.f.j.d.JsonMappingException: (was java.lang.NullPointerException) 
  (through reference chain: com.example.foobar.foo[\"fullName\"])
   c.f.j.d.JsonMappingException.wrapWithPath(JsonMappingException.java:379)
  c.f.j.d.JsonMappingException.wrapWithPath(JsonMappingException.java:339)
  c.f.j.d.s.s.StdSerializer.wrapAndThrow(StdSerializer.java:343)
  c.f.j.d.s.s.BeanSerializerBase.serializeFields(BeanSerializerBase.java:698)
  c.f.j.d.s.BeanSerializer.serialize(BeanSerializer.java:155)
  c.f.j.d.s.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292)
  c.f.j.d.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1419)
  c.f.j.d.ObjectWriter.writeValue(ObjectWriter.java:940)
  o.s.h.c.j.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:267)...
  23 common frames omitted\nWrapped by: o.s.h.c.HttpMessageNotWritableException: Could not write content: (was java.lang.NullPointerException) (through reference chain: com.example.foobar.foo[\"fullName\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.example.foobar.foo[\"fullName\"])
                                                                                                                                                o.s.h.c.j.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:274 ..."
这是我发送的请求主体

{"firstName": "foo",
"lastName: null
}
Jackson正在尝试序列化fullName属性吗?但我没有声明这样的字段。这是预期的行为吗?我找不到支持此行为的文档


谢谢

您的猜测是对的,Jackson正试图通过其getter方法找到字段名,但它找不到。因此,NPE

不同的解决方案

  • 在getFullName方法上使用
    @JsonIgnore
  • 您可以通过在spring boot application.properties文件中设置此属性来禁用此功能

    spring.jackson.mapper.使用getter作为setter=false

  • 如果您希望使用java代码(如果不使用SpringBoot),可以使用如下bean声明

    @Bean
    public Jackson2ObjectMapperBuilder objectMapperBuilder() {
      Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
      builder.featuresToDisable(MapperFeature.USE_GETTERS_AS_SETTERS);
      return builder;
    }
    

  • 是的,你是对的。对getFullName方法使用
    @JsonIgnore
    。另外,我建议使用
    @Getter
    @Setter
    而不是
    @Data
    @pvpkiran为什么不使用@Data呢?没有什么错。但我发现@Data与Jackson的反序列化并不协调。只是一个建议