簡體   English   中英

如何使用 Feign Client Spring Boot 從另一個服務獲取數據(錯誤:406)

[英]How to get data from another service using Feign Client Spring Boot (ERROR: 406)

當我使用 Feign Client 從一個服務(API 網關)調用另一個服務(用戶服務)時,出現錯誤

有兩種服務

  1. 用戶服務
  2. API網關

在我的 API 網關中

假客戶端

@FeignClient(contextId = "user-by-email",name = "user-service")
@Service
public interface UserByEmail {
    @RequestMapping(value = "/email/{email}", consumes= MediaType.APPLICATION_JSON_VALUE)
    User findByEmail(@PathVariable("email") String email);
}

控制器

@RequestMapping("/test")
public class TestController {
    @Autowired
    private UserByEmail userByEmail;

    @GetMapping(value = "/{email:.+}")
    public ResponseEntity testUser(@PathVariable("email") String username) {
        return ResponseEntity.ok(userByEmail.findByEmail(username));
    }
}

我需要調用以下(用戶服務)

控制器

@EnableFeignClients
@RestController
public class UserController extends BaseController<User> {
    @Autowired
    private UserService userService;

    @PostConstruct
    public void binder() {
        init(this.userService);
    }

    @GetMapping(value = "/email/{email}")
    public ResponseEntity findByEmail(@PathVariable("email") String email) {
        return ResponseEntity.ok(userService.findByEmail(email));
    }
}

存儲庫

@Override
public User findByEmail(String email) {
  Query query = new Query(Criteria.where("email").is(email).and("status").is(1));
  return mongoOperations.findOne(query, User.class);
}

服務

@Override
public User findByEmail(String email) {
  return userDao.findByEmail(email);
}

我得到的錯誤是..

<Map>
    <timestamp>1583924335777</timestamp>
    <status>406</status>
    <error>Not Acceptable</error>
    <message>Could not find acceptable representation</message>
    <trace>org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation&#xd;
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:246)&#xd;

任何人都可以解釋我的代碼有什么問題,並提供您寶貴的解決方案

(基本上我需要在API網關中創建Security,以控制其他服務的訪問)

嘗試實現 Feign 客戶端如下:

@FeignClient(name = "user-service")
public interface UserByEmail {

 @RequestMapping(method = RequestMethod.GET, value = "/email/{email}", consumes = "application/json")
 User findByEmail(@PathVariable("email") String email);

 }

還要確保字段通過 JSON 匹配器User POJO。

我有我的問題的解決方案

假客戶端

@FeignClient(contextId = "user-by-email",name = "user-service")
@Service
public interface UserByEmail {
    @RequestMapping(value = "/email/{email}", consumes= MediaType.APPLICATION_JSON_VALUE)
    User findByEmail(@RequestParam("email") String email);
}

控制器

@RequestMapping("/test")
public class TestController {
    @Autowired
    private UserByEmail userByEmail;

    @GetMapping(value = "/{email}")
    public ResponseEntity testUser(@RequestParam("email") String username) {
        return ResponseEntity.ok(userByEmail.findByEmail(username));
    }
}

在用戶服務中

控制器

@EnableFeignClients
@RestController
public class UserController extends BaseController<User> {
    @Autowired
    private UserService userService;

    @PostConstruct
    public void binder() {
        init(this.userService);
    }

    @GetMapping(value = "/email/{email}")
    public ResponseEntity findByEmail(@RequestParam("email") String email) {
        return ResponseEntity.ok(userService.findByEmail(email));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM