This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Config SpecMapper

    Starter 會在 App 啟動的過程中自動的配置一個 Default SpecMapper, 並註冊成 Spring @Bean 中, 你可以透過 Autowired 的方式跟 Spring 取得.

    @Autowired SpecMapper specMapper;
    

    例如, 我想要在轉換成 Specification 後, 先做一些加強再去查詢, 則範例如下:

    class PersonService {
    
      @Autowired SpecMapper specMapper;
      @Autowired PersonRepository personRepository;
    
      List<Person> getPersonByCriteria(PersonCriteria criteria) {
        var spec = specMapper.toSpec(criteria);
        
        // Perform additional operations on the spec, ex:
        // spec = spec.and((root, query, criteriaBuilder) ->  {
        //     ...
        // });
        
        return personRepository.findAll(spec);
      }
    }
    

    在上述範例中, SpecMapper 被注入到了 PersonService, 開發人員就可以使用 specMapper.toSpec() 將 criteria 物件轉換成 specification, 接著就可以對 specification 做更多的調整, 最後才傳入 personRepository 查詢

    Configuration

    Starter 提供了許多方式讓開發人員調整 Default SpecMapper 的配置

    SpecificationResolver

    SpecificationResolver 是用來增加自定義的 Spec Annotation, 只要將你要增加的客製化實作註冊成 Spring @Bean, 在 App 啟動的過程中就會自動的偵測及配置

    範例如下:

    @Configuration
    class MyConfig {
    
      @Bean
      SpecificationResolver myResolver() {
        return ...
      }
    }
    

    如果你的 SpecificationResolver 需要用到 SpecMapper 本身, 則你可以包裝成 SpecificationResolverCodecBuilder, 在建構 resolver 時就會把 SpecCodec, 即 SpecMapper 的 interface, 傳進去, 例如:

    @Configuration
    class MyConfig {
    
      @Bean
      SpecificationResolverCodecBuilder myResolver() {
        return MySpecificationResolver::new;
      }
    }
    
    class MySpecificationResolver implements SpecificationResolver {
      
      private final SpecCodec codec;
      
      MySpecificationResolver(SpecCodec codec) {
        // Keep the SpecCodec around to used.
        this.codec = codec;
      }
      
      // implementation goes here
    }
    

    SkippingStrategy

    SkippingStrategy 用來提供欄位跳脫的策略, 只要將你自定義的實作註冊成 Spring @Bean, 在 App 啟動的過程中就會自動的偵測並加入到 Default SpecMapper 中!

    配置範例如下:

    @Configuration
    class MyConfig {
    
      @Bean
      SkippingStrategy mySkippingStrategy() {
        return ...
      }
    }
    

    ASTWriterFactory

    Logging 中提供了不同的 Logger Name 策略, 透過 properties 中的 spec.mapper.impersonate-logger, 可以設定是否要偽裝成實際處理的 object logger, 預設是關閉的, 若要開啟範例如下:

    spec:
      mapper:
        # 是否要偽裝成實際處理的 object logger, 預設關閉
        impersonate-logger: true
    

    若你需要完整的客製化, 只要將你自定義的 ASTWriterFactory 實作註冊成 Spring @Bean, 在 App 啟動的過程中就會自動的偵測並加入到 Default SpecMapper 中!

    配置範例如下:

    @Configuration
    class MyConfig {
    
      @Bean
      ASTWriterFactory myASTWriterFactory() {
        return ...
      }
    }
    

    Customize SpecMapper

    當然, 你也可以完全的客製化 SpecMapper, 只要將你的 SpecMapper 註冊成 Spring @Bean, 就會最優先的使用!

    配置範例如下:

    @Configuration
    class MyConfig {
    
      @Bean
      SpecMapper mySpecMapper() {
        return SpecMapper.builder()
          . ...
          .build();
      }
    }