Create environment
Step1 Create DTO for integrating with microservice
Create DTO for integrating with microservices through which data will be sent to the microservice
Example
Step 2 Create DAO
Create DAO extends AbstractAnySourceBaseDAO implements AnySourceBaseDAO
Example
@Service
@RequiredArgsConstructor
public class MyEntityDao extends AbstractAnySourceBaseDAO<MyEntityOutServiceDTO> implements AnySourceBaseDAO<MyEntityOutServiceDTO> {
private final IntegrationConfiguration integrationConfig;
private final RestTemplate restTemplate;
@Override
public String getId(final MyEntityOutServiceDTO entity) {
return entity.getId();
}
@Override
public void setId(final String id, final MyEntityOutServiceDTO entity) {
entity.setId(id);
}
// --8<-- [start:getByIdIgnoringFirstLevelCache]
@Override
public MyEntityOutServiceDTO getByIdIgnoringFirstLevelCache(final BusinessComponent bc) {
return restTemplate.exchange(
fromUriString(integrationConfig.getGetStartedMicroservicesDataServerUrl() + "/{id}").build()
.expand(bc.getIdAsLong()).normalize().encode()
.toUriString(),
GET, null, MyEntityOutServiceDTO.class
).getBody();
}
// --8<-- [end:getByIdIgnoringFirstLevelCache]
// --8<-- [start:getList]
@Override
public Page<MyEntityOutServiceDTO> getList(final BusinessComponent bc, final QueryParameters queryParameters) {
//Page size
String page = bc.getParameters().getParameter("_page");
//Limit
String limit = bc.getParameters().getParameter("_limit");
//Filter
List<String> filterCustomField = getFilterFieldName(queryParameters, "customField", "contains");
Optional<String> filter = filterCustomField.isEmpty() ? Optional.empty() : Optional.of(filterCustomField.get(0));
//Sorting
List<String> sortCustomField = getSortFieldName(queryParameters, "customField");
Optional<String> sort = sortCustomField.isEmpty() ? Optional.empty() : Optional.of(sortCustomField.get(0));
String urlTemplate = UriComponentsBuilder.fromHttpUrl(integrationConfig.getGetStartedMicroservicesDataServerUrl())
.queryParam("number", page)
.queryParam("size", limit)
.queryParamIfPresent("filterCustomField", filter)
.queryParamIfPresent("sortCustomField", sort)
.encode()
.toUriString();
ResponseEntity<RestResponsePage<MyEntityOutServiceDTO>> responseEntity = restTemplate.exchange(
urlTemplate,
HttpMethod.GET,
null,
new ParameterizedTypeReference<>() {
},
filter
);
return responseEntity.getBody();
}
private List<String> getSortFieldName(QueryParameters queryParameters, String fieldName) {
return queryParameters.getParameters().entrySet().stream()
.filter(f -> f.getKey().contains("_sort"))
.filter(f -> f.getValue().contains(fieldName))
.map(m -> {
String[] splitOperation = m.getKey().split("\\.");
return splitOperation[splitOperation.length - 1];
}
).toList();
}
private List<String> getFilterFieldName(QueryParameters queryParameters, String fieldName, String searchSpec) {
return queryParameters.getParameters().entrySet().stream()
.filter(f -> f.getKey().contains(fieldName + "." + searchSpec))
.map(Map.Entry::getValue)
.toList();
}
// --8<-- [end:getList]
@Override
// --8<-- [start:delete]
public void delete(BusinessComponent bc) {
restTemplate.exchange(
fromUriString(integrationConfig.getGetStartedMicroservicesDataServerUrl() + "/{id}").build().expand(bc.getIdAsLong()).normalize().encode()
.toUriString(),
DELETE, null, Void.class
);
}
// --8<-- [end:delete]
@Override
// --8<-- [start:create]
public MyEntityOutServiceDTO create(BusinessComponent bc, MyEntityOutServiceDTO entity) {
entity.setId(null);
return restTemplate.exchange(
fromUriString(integrationConfig.getGetStartedMicroservicesDataServerUrl()).build().normalize().encode().toUriString(),
POST, new HttpEntity<>(entity), MyEntityOutServiceDTO.class
).getBody();
}
// --8<-- [end:create]
@Override
// --8<-- [start:update]
public MyEntityOutServiceDTO update(BusinessComponent bc, MyEntityOutServiceDTO entity) {
return restTemplate.exchange(
fromUriString(integrationConfig.getGetStartedMicroservicesDataServerUrl()).build().normalize().encode().toUriString(),
PUT, new HttpEntity<>(entity), MyEntityOutServiceDTO.class
).getBody();
}
// --8<-- [end:update]
}
Override methods:
- Create : method create
Example
public MyEntityOutServiceDTO create(BusinessComponent bc, MyEntityOutServiceDTO entity) {
entity.setId(null);
return restTemplate.exchange(
fromUriString(integrationConfig.getGetStartedMicroservicesDataServerUrl()).build().normalize().encode().toUriString(),
POST, new HttpEntity<>(entity), MyEntityOutServiceDTO.class
).getBody();
}
- Deletion: method delete
Example
- Update of existing entries: method update
Example
public MyEntityOutServiceDTO update(BusinessComponent bc, MyEntityOutServiceDTO entity) {
return restTemplate.exchange(
fromUriString(integrationConfig.getGetStartedMicroservicesDataServerUrl()).build().normalize().encode().toUriString(),
PUT, new HttpEntity<>(entity), MyEntityOutServiceDTO.class
).getBody();
}
- Getting all data: method getList
Example
@Override
public Page<MyEntityOutServiceDTO> getList(final BusinessComponent bc, final QueryParameters queryParameters) {
//Page size
String page = bc.getParameters().getParameter("_page");
//Limit
String limit = bc.getParameters().getParameter("_limit");
//Filter
List<String> filterCustomField = getFilterFieldName(queryParameters, "customField", "contains");
Optional<String> filter = filterCustomField.isEmpty() ? Optional.empty() : Optional.of(filterCustomField.get(0));
//Sorting
List<String> sortCustomField = getSortFieldName(queryParameters, "customField");
Optional<String> sort = sortCustomField.isEmpty() ? Optional.empty() : Optional.of(sortCustomField.get(0));
String urlTemplate = UriComponentsBuilder.fromHttpUrl(integrationConfig.getGetStartedMicroservicesDataServerUrl())
.queryParam("number", page)
.queryParam("size", limit)
.queryParamIfPresent("filterCustomField", filter)
.queryParamIfPresent("sortCustomField", sort)
.encode()
.toUriString();
ResponseEntity<RestResponsePage<MyEntityOutServiceDTO>> responseEntity = restTemplate.exchange(
urlTemplate,
HttpMethod.GET,
null,
new ParameterizedTypeReference<>() {
},
filter
);
return responseEntity.getBody();
}
private List<String> getSortFieldName(QueryParameters queryParameters, String fieldName) {
return queryParameters.getParameters().entrySet().stream()
.filter(f -> f.getKey().contains("_sort"))
.filter(f -> f.getValue().contains(fieldName))
.map(m -> {
String[] splitOperation = m.getKey().split("\\.");
return splitOperation[splitOperation.length - 1];
}
).toList();
}
private List<String> getFilterFieldName(QueryParameters queryParameters, String fieldName, String searchSpec) {
return queryParameters.getParameters().entrySet().stream()
.filter(f -> f.getKey().contains(fieldName + "." + searchSpec))
.map(Map.Entry::getValue)
.toList();
}
- Getting data by ID: method getByIdIgnoringFirstLevelCache
Example
@Override
public MyEntityOutServiceDTO getByIdIgnoringFirstLevelCache(final BusinessComponent bc) {
return restTemplate.exchange(
fromUriString(integrationConfig.getGetStartedMicroservicesDataServerUrl() + "/{id}").build()
.expand(bc.getIdAsLong()).normalize().encode()
.toUriString(),
GET, null, MyEntityOutServiceDTO.class
).getBody();
}
Step 3 Create DTO
Create DTO extends DataResponseDTO
Example
Step4 Create MetaBuilder
Create MetaBuilder extends AnySourceFieldMetaBuilder
Example
@Service
public class MyExampleMeta extends AnySourceFieldMetaBuilder<MyExampleDTO> {
// --8<-- [start:buildRowDependentMeta]
@Override
public void buildRowDependentMeta(RowDependentFieldsMeta<MyExampleDTO> fields, BcDescription bc,
String id, String parentId) {
}
// --8<-- [start:buildRowDependentMeta]
@Override
public void buildIndependentMeta(FieldsMeta<MyExampleDTO> fields, BcDescription bcDescription,
String parentId) {
}
}
Step5 Create Service
Create Service extends AnySourceVersionAwareResponseService
Example
@Service
public class MyExampleService extends AnySourceVersionAwareResponseService<MyExampleDTO, MyEntityOutServiceDTO> {
public MyExampleService() {
super(MyExampleDTO.class, MyEntityOutServiceDTO.class, null, MyEntityDao.class);
}
@Override
protected CreateResult<MyExampleDTO> doCreateEntity(MyEntityOutServiceDTO entity, BusinessComponent bc) {
return new CreateResult<>(entityToDto(bc, entity));
}
@Override
protected ActionResultDTO<MyExampleDTO> doUpdateEntity(MyEntityOutServiceDTO entity, MyExampleDTO data, BusinessComponent bc) {
return new ActionResultDTO<>(entityToDto(bc, entity));
}
// --8<-- [start:getActions]
@Override
public Actions<MyExampleDTO> getActions() {
return Actions.<MyExampleDTO>builder()
.action(act -> act
.action("save", "save")
)
.build();
}
// --8<-- [end:getActions]
}
Step6 Create Controller
Create Controller implements EnumBcIdentifier
Example
@Getter
public enum PlatformMyExampleController implements EnumBcIdentifier {
myExampleBc(MyExampleService.class);
public static final EnumBcIdentifier.Holder<PlatformMyExampleController> Holder = new Holder<>(
PlatformMyExampleController.class);
private final BcDescription bcDescription;
PlatformMyExampleController(String parentName, Class<?> serviceClass, boolean refresh) {
this.bcDescription = buildDescription(parentName, serviceClass, refresh);
}
PlatformMyExampleController(Class<?> serviceClass) {
this((String) null, serviceClass, false);
}
@Component
public static class BcSupplier extends AbstractEnumBcSupplier<PlatformMyExampleController> {
public BcSupplier() {
super(PlatformMyExampleController.Holder);
}
}
}