FeignClients публикуются как конечные точки REST в весеннем облачном приложении.

В моем приложении определен REST FeignClient:

@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;

}

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

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

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


person Ondrej Bozek    schedule 18.01.2017    source источник


Ответы (2)


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

person spencergibb    schedule 18.01.2017
comment
Похоже на ошибку в SpringMvc. Я также пытался исключить мои FeignClients из сканирования компонентов, но это не сработало. - person Ondrej Bozek; 18.01.2017
comment
Почти уверен, что это была функция в течение довольно долгого времени. Это ярлык, поэтому вам не нужно ставить и @RequestMapping, и @Component. - person spencergibb; 18.01.2017
comment
Кажется, они забыли упомянуть об этом поведении в документации или javadoc. Это также кажется довольно неожиданным поведением. - person Ondrej Bozek; 19.01.2017

Я использовал обходной путь для этого ошибочного поведения 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

person Ondrej Bozek    schedule 19.01.2017