0

I am trying to create a property in my application.properties file application.required.host.endpoint=db:feature-flag?old-value-label:new-value-label

I need to load feature-flag,old-value-label and new-value-label from database and evaluate this as SPEL expression. I am planning to evaluate db: protocol while loading the properties file(spring loads this application.properties file by default) so that when any @ConfigurationProperties class refer this key, will get either old-value-label or new-value-label based on the feature flag value.

Is this possible in spring 5?

I have tried this example but It seems I am going in wrong direction.

# spring database application.properties
spring.datasource.url=jdbc:h2:mem:system-type
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=admin
spring.datasource.password=secret
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
management.endpoints.web.exposure.include=env,health

application.required.host.endpoint=db:feature-flag?old-value-label:new-value-label

My Entity Class

package edu.gandhi.prajit.database.protocol.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;


@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SystemType implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long systemCodeId;
    private String systemCodeName;
    private String systemCode;
}

My Controller Class

package edu.gandhi.prajit.database.protocol.controller;

import edu.gandhi.prajit.database.protocol.entity.SystemType;
import edu.gandhi.prajit.database.protocol.service.SettingsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class SystemTypeAPI {
    private final SettingsService settingsService;
    @Value("#{${application.required.host.endpoint}}")
    private String applicationFrameworksSecurityTokenHost;

    @Autowired
    public SystemTypeAPI(SettingsService settingsService) {
        this.settingsService = settingsService;
    }

    @PostMapping(value = "/create/system-type", consumes = {"application/json"}, produces = {"application/json"})
    ResponseEntity<SystemType> createSystemType(@RequestBody SystemType systemType) {
        final SystemType systemTypeSaved = settingsService.saveSystemType(systemType);
        return ResponseEntity.created(URI.create("/create/system-type/" + systemTypeSaved.getSystemCodeId())).build();
    }

    @GetMapping(value = "/list/system-type", produces = {"application/json"})
    ResponseEntity<List<SystemType>> getAllSystemType() {
        final List<SystemType> systemTypes = settingsService.getAllSystemType();
        return ResponseEntity.ok(systemTypes);
    }

    @GetMapping(value = "/token/properties", produces = {"application/json"})
    Map<String, String> getTokenProperties() {
        final Map<String, String> props = new HashMap<>();
        props.put("application.required.host.endpoint", applicationFrameworksSecurityTokenHost);
        return props;
    }
}

My Service & Repository Class

package edu.gandhi.prajit.database.protocol.repository;

import edu.gandhi.prajit.database.protocol.entity.SystemType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface SettingsRepository extends JpaRepository<SystemType, Long> {

}
package edu.gandhi.prajit.database.protocol.service;

import edu.gandhi.prajit.database.protocol.entity.SystemType;
import edu.gandhi.prajit.database.protocol.repository.SettingsRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@Transactional
public class SettingsService {
    private final SettingsRepository settingsRepository;

    @Autowired
    public SettingsService(SettingsRepository settingsRepository) {
        this.settingsRepository = settingsRepository;
    }

    public SystemType saveSystemType(SystemType systemType) {
        return settingsRepository.save(systemType);
    }

    public List<SystemType> getAllSystemType() {
        return settingsRepository.findAll();
    }

    public Map<String, String> getAllSystemTypeAsMap() {
        return settingsRepository.findAll().stream().collect(Collectors.toMap(SystemType::getSystemCodeName, SystemType::getSystemCode));
    }
}
prajitgandhi
  • 483
  • 1
  • 5
  • 20

0 Answers0