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));
}
}