带有Java可选getter的REST响应对象

带有Java可选getter的REST响应对象,java,json,spring,jackson,optional,Java,Json,Spring,Jackson,Optional,我正在用SpringBoot编写一个REST服务。我想将DTO类的一些字段作为可选的getter进行访问。这是一个例子 @JsonInclude(Include.NON_NULL) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "profileType", visible = true, defaultImpl = InvalidUserDTO.c

我正在用SpringBoot编写一个REST服务。我想将DTO类的一些字段作为可选的getter进行访问。这是一个例子

@JsonInclude(Include.NON_NULL)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "profileType", visible = true, defaultImpl = InvalidUserDTO.class)
@JsonSubTypes({ @JsonSubTypes.Type(value = ClientDTO.class, name = "CLIENT"), @JsonSubTypes.Type(value = DriverDTO.class, name = "DRIVER") })
public abstract class UserDTO {

    private String password;

    private Optional<String> email;
我有什么遗漏吗?为什么会这样

以下是ObjectMapper配置:

@SpringBootApplication
public class MainApplication extends SpringBootServletInitializer {

    @Autowired
    void configureObjectMapper(final ObjectMapper mapper) {
        mapper
            .registerModule(new ParameterNamesModule())
            .registerModule(new Jdk8Module());
    }    

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.setInitParameter("webAppRootKey", "newfacesBackend.root");
        servletContext.setInitParameter("isLog4jAutoInitializationDisabled", "true");
        super.onStartup(servletContext);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(MainApplication.class, args);
    }

}
渐变依赖项:

buildscript {
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.4.RELEASE")
    }
}

apply plugin: 'com.github.ben-manes.versions'
apply plugin: 'maven-publish'
apply plugin: 'org.springframework.boot'


configurations {
    compile.exclude group:'ch.qos.logback'
}

dependencies {


    compile("org.springframework.boot:spring-boot-starter-actuator")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.4")

    compile("com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.4")

您应该向映射器注册JDK8模块,如:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jdk8Module());
或者

您可以通过向主Spring Boot应用程序类中添加以下内容来全局执行此操作:

  @Autowired
  void configureObjectMapper(final ObjectMapper mapper) {
   mapper.registerModule(new ParameterNamesModule())
  .registerModule(new Jdk8Module());
  }
参数NamesModule
的依赖关系是:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
</dependency>

com.fasterxml.jackson.module
jackson模块参数名

您应该向映射器注册JDK8模块,如:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jdk8Module());
或者

您可以通过向主Spring Boot应用程序类中添加以下内容来全局执行此操作:

  @Autowired
  void configureObjectMapper(final ObjectMapper mapper) {
   mapper.registerModule(new ParameterNamesModule())
  .registerModule(new Jdk8Module());
  }
参数NamesModule
的依赖关系是:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
</dependency>

com.fasterxml.jackson.module
jackson模块参数名

删除
configureObjectMapper
并尝试以下操作:

@Configuration
public class ObjectMapperConfig

    @Bean
    @Primary
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.build();
        objectMapper.registerModule(new Jdk8Module());
        return objectMapper;
    }

}

删除
configureObjectMapper
,然后尝试以下操作:

@Configuration
public class ObjectMapperConfig

    @Bean
    @Primary
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.build();
        objectMapper.registerModule(new Jdk8Module());
        return objectMapper;
    }

}

有了这个问题,我发现我有不兼容的依赖项

您有依赖关系
org.springframework.boot:springbootstarteractor:1.5.4.RELEASE

buildscript {
  dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.4.RELEASE")
  }
}
...
dependencies {
  compile("org.springframework.boot:spring-boot-starter-actuator")
}
它有自己的依赖项
com.fasterxml.jackson.core:jackson-databind:2.8.8
并且与您提供的另一个fasterxml依赖项不兼容:

compile("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.4")
解决方案

只需降级jackson-datatype-jdk8版本:

compile("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.8.8")

有了这个问题,我发现我有不兼容的依赖项

您有依赖关系
org.springframework.boot:springbootstarteractor:1.5.4.RELEASE

buildscript {
  dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.4.RELEASE")
  }
}
...
dependencies {
  compile("org.springframework.boot:spring-boot-starter-actuator")
}
它有自己的依赖项
com.fasterxml.jackson.core:jackson-databind:2.8.8
并且与您提供的另一个fasterxml依赖项不兼容:

compile("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.4")
解决方案

只需降级jackson-datatype-jdk8版本:

compile("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.8.8")

您所有的Jackson依赖项是否都在同一个2.9.1版本中?是否在您的上添加了
Jdk8Module
?@KarolDowbecki我不知道,它们来自Spring Boot Starter 1.5.4。我没有申报explicitly@Dherik是的,但这并没有改变什么。您是如何做到这一点的(添加JDK8模块)?在问题上发布代码您的所有Jackson依赖项是否都在相同的2.9.1版本中?您是否在您的上添加了
Jdk8Module
?@KarolDowbecki我不知道,它们来自Spring Boot Starter 1.5.4。我没有申报explicitly@Dherik是的,但这并没有改变什么。您是如何做到这一点的(添加JDK8模块)?在问题上发布代码我找不到此ParameterNamesModule?它的依赖性是什么?带依赖性的编辑答案没有这个依赖性,这都是相同的错误。添加它会导致这样的结果:“由以下原因引起:org.springframework.beans.BeanStanitiationException:未能实例化[com.fasterxml.jackson.module.ParameterNamesModule]:工厂方法'ParameterNamesModule'引发异常;嵌套异常为java.lang.NoSuchMethodError:com.fasterxml.jackson.module.ParameterNames.ParameterNamesModule”请看一看。添加这些依赖项并注册所有模块在理想情况下会对您有所帮助,我不知道为什么会出现这些错误。我找不到这个ParameterNamesModule?它的依赖性是什么?带依赖性的编辑答案没有这个依赖性,这都是相同的错误。添加它会导致这样的结果:“由以下原因引起:org.springframework.beans.BeanStanitiationException:未能实例化[com.fasterxml.jackson.module.ParameterNamesModule]:工厂方法'ParameterNamesModule'引发异常;嵌套异常为java.lang.NoSuchMethodError:com.fasterxml.jackson.module.ParameterNames.ParameterNamesModule”请看一看。添加这些依赖项并注册所有模块在理想情况下会对您有所帮助,因为您不知道为什么会出现这些错误。