package me.roybailey.springboot.service; import feign.*; import feign.jackson.JacksonDecoder; import feign.jackson.JacksonEncoder; import lombok.extern.slf4j.Slf4j; import me.roybailey.data.schema.OrderDto; import me.roybailey.springboot.configuration.DataSourceProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.util.List; @Slf4j @Service() public class OrderAdaptor { @Autowired DataSourceProperties properties; @Headers("Accept: application/json") private interface OrderApi { @RequestLine("GET /order-api/v1/order") List<OrderDto> getAllOrders(); @RequestLine("GET /order-api/v1/order/{id}") OrderDto getOrderById(@Param("id") String id); @Headers("Content-Type: application/json") @RequestLine("POST /order-api/v1/order") OrderDto createOrder(OrderDto order); } private OrderApi api; @PostConstruct public void apiSetup() { log.info("Connecting {} to {}", OrderApi.class.getSimpleName(), properties.getUrlOrderService()); this.api = Feign.builder() .encoder(new JacksonEncoder()) .decoder(new JacksonDecoder()) .logLevel(Logger.Level.BASIC) .target(OrderApi.class, properties.getUrlOrderService()); } public List<OrderDto> getAllOrders() { List<OrderDto> allOrders = api.getAllOrders(); log.info("getAllOrders() : {}", allOrders); return allOrders; } public OrderDto getOrder(String orderId) { OrderDto order = api.getOrderById(orderId); log.info("getOrder({}) : {}", orderId, order); return order; } public OrderDto createOrder(OrderDto order) { OrderDto newOrder = api.createOrder(order); log.info("createOrder({}) : {}", order, newOrder); return newOrder; } }