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 를 기록 하 겠 습 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring Cloud에서 Feign에 대한 일반적인 질문 요약1. FeignClient 인터페이스, @GettingMapping 같은 조합 메모는 사용할 수 없음 코드 예: 이쪽 @RequestMapping(value = "/simple/{id}", method = Reque...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.