0

Я получил REST FeignClient определен в моем приложении:FeignClients публикуется в REST конечных точек в весеннем применении облачного

@FeignClient(name = "gateway", configuration = FeignAuthConfig.class) 
public interface AccountsClient extends Accounts { 

} 

делится интерфейсом конечной точки между сервером и клиентом:

@RequestMapping(API_PATH) 
public interface Accounts { 


    @PostMapping(path = "/register", 
      produces = APPLICATION_JSON_VALUE, 
      consumes = APPLICATION_JSON_VALUE) 
    ResponseEntity<?> registerAccount(@RequestBody ManagedPassUserVM managedUserDTO) 
      throws EmailAlreadyInUseException, UsernameAlreadyInUseException, URISyntaxException; 

} 

Everythng работает отлично за исключением того, что мое определение FeignClient в моем клиентском приложении также зарегистрировано как независимая конечная точка REST.

На данный момент я пытаюсь предотвратить это поведение с помощью фильтра, который возвращает 404 код состояния для FeignClinet клиентских сопоставлений в моем клиентском приложении. Однако эта работа кажется очень неэлегантной.

Есть ли другой способ предотвратить появление подозрительных клиентов в качестве отдельных конечных точек REST?

ответ

1

Это известное ограничение поддержки фейерверков Spring Cloud. Добавляя к интерфейсу @RequestMapping, Spring MVC (а не Spring Cloud) предполагает, что вы хотите как конечную точку. @RequestMapping на интерфейсах Feign в настоящее время не поддерживается.

+0

Похоже, что ошибка в SpringMVC. Я также попытался опустить мои FeignClients из проверки компонентов, и это не сработало. –

+0

Довольно уверен, что это была функция довольно долгое время. Это ярлык, поэтому вам не нужно указывать как '@ RequestMapping', так и' @ Component'. – spencergibb

+0

Кажется, что они забыли упомянуть об этом в документации или javadoc. Это также кажется совершенно неожиданным поведением. –

0

Я использовал обходной путь для этого дефектного Spring Framework поведения:

@Configuration 
@ConditionalOnClass({Feign.class}) 
public class FeignMappingDefaultConfiguration { 
    @Bean 
    public WebMvcRegistrations feignWebRegistrations() { 
     return new WebMvcRegistrationsAdapter() { 
      @Override 
      public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { 
       return new FeignFilterRequestMappingHandlerMapping(); 
      } 
     }; 
    } 

    private static class FeignFilterRequestMappingHandlerMapping extends RequestMappingHandlerMapping { 
     @Override 
     protected boolean isHandler(Class<?> beanType) { 
      return super.isHandler(beanType) && (AnnotationUtils.findAnnotation(beanType, FeignClient.class) == null); 
     } 
    } 
} 

Я нашел его в SpringCloud issue