feign 호출 되 돌아 오 는 object 형식 변환 방식

feign 호출 되 돌아 오 는 object 형식 변환
도입 의존

       <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>

    /**
  * @Description:            
  * @param bean
  * @param clazz
  * @return
  * @throws
  * @author dlh
  * @date 2019/3/19 10:28
  */
 public static <T> T convertValue(Object bean, Class<T> clazz){
  try{
   ObjectMapper mapper = new ObjectMapper();
   return mapper.convertValue(bean, clazz);
  }catch(Exception e){
   logger.error("     :BeanUtil.convertValue() --->" + e.getMessage());
   return null;
  }
 }
SpringCloud feign 인터페이스 변환 서비스
Feign 은 RestTemplate API 대신 인터페이스 조작 을 제공 하 는 Rest 작업 입 니 다.
Feign 사용
Feign 이라는 기술 은 서비스 소비 단 에 응용 된다.
pom.xml 프로필 수정,Feign 의존 패키지 추가

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
Fegin 은 Rest 작업 을 인터페이스 로 변환 하 는 형식 이기 때문에 인 터 페 이 스 를 새로 만 들 고 인터페이스 에@FeignClient 설명 을 해 야 합 니 다.

@FeignClient(value = "DEPT-PROVIDER",configuration = FeignClientConfig.class)
public interface DeptClientService {
    @RequestMapping(method= RequestMethod.GET,value="/dept/get/{id}")
    public Dept get(@PathVariable("id") long id) ;
    @RequestMapping(method=RequestMethod.GET,value="/dept/list")
    public List<Dept> list() ;
    @RequestMapping(method=RequestMethod.POST,value="/dept/add")
    public boolean add(Dept dept) ;
}
@Configuration
public class FeignClientConfig {
    @Bean
    public Logger.Level getFeignLoggerLevel() {
        return feign.Logger.Level.FULL ;
    }
    @Bean
    public BasicAuthRequestInterceptor getBasicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor("admin", "admin");
    }
}
그 중에서 configuration=FeignClient Config.class 는 필수 가 아 닙 니 다.configuration 속성 을 제거 해도 work 할 수 있 습 니 다.
이전 Rest 작업 의 API 를 DeptClient Service 인터페이스 형식 으로 바 꿉 니 다.

@RestController
@RequestMapping("/consumer/dept")
public class ConsumerDeptController {
    @Autowired
    private DeptClientService deptClientService;
    @RequestMapping(value = "/get")
    public Dept get(long id) {
        return this.deptClientService.get(id);
    }
    @RequestMapping("/list")
    public List<Dept> list(){
        return this.deptClientService.list();
    }
    @RequestMapping("/add")
    public boolean add(Dept dept){
        return this.add(dept);
    }
/*
    public static final String DEPT_GET_URL = "http://DEPT-PROVIDER/dept/get/";
    public static final String DEPT_LIST_URL = "http://DEPT-PROVIDER/dept/list/";
    public static final String DEPT_ADD_URL = "http://DEPT-PROVIDER/dept/add";
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private HttpHeaders httpHeaders;
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @RequestMapping(value = "/get")
    public Dept get(long id) {
        ServiceInstance serviceInstance = this.loadBalancerClient.choose("DEPT-PROVIDER") ;
        System.out.println(
                "【*** ServiceInstance ***】host = " + serviceInstance.getHost()
                        + "、port = " + serviceInstance.getPort()
                        + "、serviceId = " + serviceInstance.getServiceId());
        //Dept dept = restTemplate.getForObject(DEPT_GET_URL + id, Dept.class);
        Dept dept = restTemplate.exchange(DEPT_GET_URL+id, HttpMethod.GET,new HttpEntity<Object>(this.httpHeaders),Dept.class).getBody();
        return dept;
    }
    @RequestMapping("/list")
    public List<Dept> list(){
        //List<Dept> deptList = restTemplate.getForObject(DEPT_LIST_URL, List.class);
        List<Dept> deptList = this.restTemplate.exchange(DEPT_LIST_URL,HttpMethod.GET,new HttpEntity<Object>(this.httpHeaders),List.class).getBody();
        return deptList;
    }
    @RequestMapping("/add")
    public boolean add(Dept dept){
        //Boolean flag = restTemplate.postForObject(DEPT_ADD_URL, dept, Boolean.class);
        Boolean flag = this.restTemplate.exchange(DEPT_ADD_URL,HttpMethod.POST,new HttpEntity<Object>(this.httpHeaders),Boolean.class).getBody();
        return flag;
    }*/
}
시작 클래스 에@EnableFeignClient 주석 추가

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"cn.zgc.service"})
public class FeignConsumer_80_StartSpringCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(FeignConsumer_80_StartSpringCloudApplication.class,args);
    }
}
Feign 은 균형 잡 힌 특성 을 가지 고 있 기 때문에 Feign 을 사용 한 후 리본 을 사용 하지 않 아 도 된다.
Feign 설정
Feign 의 가장 중요 한 기능 은 Rest 서비스의 정 보 를 인터페이스 로 전환 하 는 것 입 니 다.그러나 실제 사용 에서 도 일부 설정 상황 을 고려 해 야 합 니 다.예 를 들 어 데이터 압축,Rest 의 핵심 본질은 JSON 데이터 전송(XML,텍스트)입 니 다.그래서 한 가지 상황 을 생각해 야 합 니 다.만약 에 사용자 가 보 낸 데이터 가 크다 면?따라서 이 럴 때 application.yml 설정 파일 을 수정 하여 전송 데 이 터 를 압축 하 는 것 을 고려 할 수 있 습 니 다.

feign:
 compression:
 request:
 mime-types:  #         
 - text/xml
 - application/xml
 - application/json
 min-request-size: 2048 #   2048       
Feign 로그 열기(기본 값 은 열 리 지 않 음)

logging:
 level:
 cn.zgc.service: DEBUG
feign 호출 시 매개 변 수 를 되 돌려 줍 니 다.원 하 는 데이터 형식 이 아 닙 니 다.
오늘 구덩이 에 부 딪 혔 습 니 다.feign 이 다른 응용 프로그램 을 호출 할 때 반 참 은 기대 하 는 유형 이 아 닙 니 다.이게 다른 요청 방식 에 이 버그 가 있 는 지 모 르 겠 어 요.
해결 방법
feign 에서 호출 된 곳 에서 Response를 지정 합 니 다.의 범 형 류,나 는 기대 에 부 딪 히 면 Long 유형 으로 돌아 가 는 것 이지 만 Integer 유형 으로 돌아 가 는 것 입 니 다.암시 적 으로 바 뀌 었 는 지 모 르 겠 습 니 다.여기에 이 Bug 를 기록 하 겠 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기