从Spring Boot 1.5升级到2.0

POM

@H_502_2@
  • 1.5
  • <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
        <relativePath/>
    </parent>
    @H_502_2@
  • 2.0
  • <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.7.RELEASE</version>
        <relativePath/>
    </parent>

    Spring Data

    Spring Data的一些方法进行了重命名

    @H_502_2@
  • findOne(id) -> findById(id) (返回的是Optional)
  • delete(id) -> deleteById(id)
  • exists(id) -> existsById(id)
  • findAll(ids) -> findAllById(ids)
  • 配置

    升级时,可以在pom中增加spring-boot-properties-migrator,这样在启动时会提示需要更改的配置:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-properties-migrator</artifactId>
        <scope>runtime</scope>
    </dependency>

    其中改动较大的是security(The security auto-configuration is no longer customizable,A global security auto-configuration is Now provided)、management、banner、server等。

    @H_502_2@
  • security
  • security开头的配置及management.security均已过期,如以下的配置不再支持,需要调整到代码中:

    security:
      ignored: /api-docs,/swagger-resources/**,/swagger-ui.html**,/webjars/**
    @H_502_2@
  • management
  • management:
      security:
        enabled: false
      port: 8090

    修改为:

    management:
      server:
        port: 8090
    @H_502_2@
  • datasource
  • datasource:
        initialize: false

    修改为:

    datasource:
        initialization-mode: never

    如使用Postgresql,可能会报错:Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented hibernate,需修改配置:

    jpa:
        database-platform: org.hibernate.dialect.PostgresqlDialect
        properties:
           hibernate:
             default_schema: test
             jdbc:
               lob:
                 non_contextual_creation: true
    @H_502_2@
  • banner调整为spring.banner
  • server调整为server.servlet
  • 更多需要调整的参数请看文末参考文档。

    Security

    WebSecurityConfigurerAdapter

    @H_502_2@
  • security.ignored
  • @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/api-docs", "/swagger-resources/**", "/swagger-ui.html**", "/webjars/**");
    }
    @H_502_2@
  • AuthenticationManager
  • 如在代码中注入了AuthenticationManager,

    @Autowired
    private AuthenticationManager authenticationManager;

    在启动时会报错:Field authenticationManager required a bean of type 'org.springframework.security.authentication.AuthenticationManager' that Could not be found.请在WebSecurityConfigurerAdapter中增加以下代码

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    Actuator

    @H_502_2@
  • 配置属性变化
  • Old property New property
    endpoints.id.* management.endpoint.id.*
    endpoints.cors.* management.endpoints.web.cors.*
    endpoints.jmx.* management.endpoints.jmx.*
    management.address management.server.address
    management.context-path management.server.servlet.context-path
    management.ssl.* management.server.ssl.*
    management.port management.server.port

    management.endpoints.web.base-path的认值为/actuator,即Actuator访问路径前部增加了actuator([/actuator/health],[/actuator/info]),这可以在启动日志中看到。
    因management.security不再支持,权限配置需添加到WebSecurityConfigurerAdapter中:

    .authorizeRequests()
    .requestMatchers(EndpointRequest.to("health", "info")).permitAll()
    @H_502_2@
  • Endpoint变化
  • Endpoint Changes
    /actuator No longer available. There is, however, a mapping available at the root of management.endpoints.web.base-path that provides links to all the exposed endpoints.
    /auditevents The after parameter is no longer required
    /autoconfig Renamed to /conditions
    /docs No longer available (the API documentation is part of the published documentation Now)
    /health Rather than relying on the sensitive flag to figure out if the health endpoint had to show full details or not, there is Now a management.endpoint.health.show-details option: never, always, when-authorized. By default, /actuator/health is exposed and details are not shown.
    /trace Renamed to /httptrace

    新特性

    @H_502_2@
  • Configuration Property Binding
  • 可以在代码中直接使用Binder API从配置文件中读取内容

    public class Person implements EnvironmentAware {
            private Environment environment;
    
            @Override
            public void setEnvironment(Environment environment) {
                this.environment = environment;
            }
    
            public void bind() {
                List<PersonName> people = Binder.get(environment)
                .bind("my.property", Bindable.listof(PersonName.class))
                .orElseThrow(IllegalStateException::new);
            }
    }

    YAML配置

    my:
      property:
      - first-name: Jane
        last-name: Doe
      - first-name: John
        last-name: Doe
    @H_502_2@
  • Spring Data Web Configuration
  • 新增spring.data.web配置来设置分页和排序:

    # DATA WEB (SpringDataWebProperties)
    spring.data.web.pageable.default-page-size=20 # Default page size.
    spring.data.web.pageable.max-page-size=2000 # Maximum page size to be accepted.
    spring.data.web.pageable.one-indexed-parameters=false # Whether to expose and assume 1-based page number indexes.
    spring.data.web.pageable.page-parameter=page # Page index parameter name.
    spring.data.web.pageable.prefix= # General prefix to be prepended to the page number and page size parameters.
    spring.data.web.pageable.qualifier-delimiter=_ # Delimiter to be used between the qualifier and the actual page number and size properties.
    spring.data.web.pageable.size-parameter=size # Page size parameter name.
    spring.data.web.sort.sort-parameter=sort # Sort parameter name.
    @H_502_2@
  • 支持自定义JdbcTemplate
  • # JDBC (JdbcProperties)
    spring.jdbc.template.fetch-size=-1 # Number of rows that should be fetched from the database when more rows are needed.
    spring.jdbc.template.max-rows=-1 # Maximum number of rows.
    spring.jdbc.template.query-timeout= # Query timeout. Default is to use the JDBC driver's default configuration. If a duration suffix is not specified, seconds will be used.
    @H_502_2@
  • 支持hibernate自定义命名策略
  • Reactive
  • 更多新特性请查看Release Notes。

    Swagger

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>

    Swagger 2.9版本,增加了对@ApiParam属性example的处理,在Swagger UI和文档中会显示,因此要注意设置合适的example值:

    @ApiOperation(value = "Delete airline by id")
    @GetMapping("/airlines/delete/{airlineId}")
    public void deleteAirline(@ApiParam(required = true, example = "123") @PathVariable Long airlineId)

    否则你会看到Warn日志:
    AbstractSerializableParameter

    @JsonProperty("x-example")
    public Object getExample() {
        if (example == null) {
            return null;
        }
        try {
            if (BaseIntegerProperty.TYPE.equals(type)) {
                return Long.valueOf(example);
            } else if (DecimalProperty.TYPE.equals(type)) {
                return Double.valueOf(example);
            } else if (BooleanProperty.TYPE.equals(type)) {
                if ("true".equalsIgnoreCase(example) || "false".equalsIgnoreCase(defaultValue)) {
                    return Boolean.valueOf(example);
                }
            }
        } catch (NumberFormatException e) {
            LOGGER.warn(String.format("Illegal DefaultValue %s for parameter type %s", defaultValue, type), e);
        }
        return example;
    }

    另外Swagger 2.9.2会为org.springframework.data.domain.Pageable自动增加@ApiImplicitParams。

    参考文档

    Spring Boot Reference Guide 2.0.7.RELEASE
    Spring Boot 2.0 Migration Guide
    Spring Boot 2.0 Configuration Changelog
    Spring Boot 2.0 Release Notes
    Spring Boot Relaxed Binding 2.0

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

    相关推荐