Изменение конфигурации привязки HTTP Camel REST - PullRequest
2 голосов
/ 19 июня 2020

Я использую Camel REST с сервлетом Camel, обрабатывающим транспорт REST, и хочу изменить способ обработки заголовков из обмена в HTTP-запросах и ответах. Я использую Spring XML для настройки своего приложения. Вот соответствующая конфигурация, которую я использую:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://camel.apache.org/schema/spring
            http://camel.apache.org/schema/spring/camel-spring.xsd">
    <!-- Custom Camel Configuration //////////////////////////////////////////////////////////////////////////////// -->
    <bean id="myHttpBinding" class="com.example.MyHttpBinding"/>
    <bean id="servlet"       class="org.apache.camel.component.servlet.ServletComponent">
        <property name="httpBinding" ref="myHttpBinding"/>
    </bean>

    <!-- Routes //////////////////////////////////////////////////////////////////////////////////////////////////// -->
    <camel:camelContext id="myCamelContext">
        <camel:contextScan/>

        <camel:restConfiguration component="servlet" enableCORS="true" bindingMode="json" skipBindingOnErrorCode="false">
            <camel:corsHeaders key="Access-Control-Allow-Methods" value="PATCH, PUT, POST, DELETE, GET, OPTIONS, HEAD"/>
            <camel:corsHeaders key="Access-Control-Allow-Origin"  value="*"/>
            <camel:corsHeaders key="Access-Control-Allow-Headers" value="*"/>
        </camel:restConfiguration>
    </camel:camelContext>
</beans>

Когда маршруты созданы, я вижу, что конечные точки настроены с установленным MyHttpBinding. Однако входящие запросы по-прежнему используют ServletRestHttpBinding. Это потому, что когда Camel создает потребителя, он выполняет этот блок кода:

if (!map.containsKey("httpBinding")) {
    // use the rest binding, if not using a custom http binding
    HttpBinding binding = new ServletRestHttpBinding();
    binding.setHeaderFilterStrategy(endpoint.getHeaderFilterStrategy());
    binding.setTransferException(endpoint.isTransferException());
    binding.setEagerCheckContentAvailable(endpoint.isEagerCheckContentAvailable());
    endpoint.setHttpBinding(binding);
}

Как я могу установить HTTP-привязку таким образом, чтобы Camel ее уважал?

1 Ответ

1 голос
/ 19 июня 2020

Поскольку Camel в конечном итоге ищет свойство httpBinding на конечной точке, чтобы определить используемую стратегию привязки, компонент REST должен быть настроен для добавления этого свойства в конечную точку следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://camel.apache.org/schema/spring
            http://camel.apache.org/schema/spring/camel-spring.xsd">
    <!-- Custom Camel Configuration //////////////////////////////////////////////////////////////////////////////// -->
    <bean id="myHttpBinding" class="com.example.MyHttpBinding"/>

    <!-- Routes //////////////////////////////////////////////////////////////////////////////////////////////////// -->
    <camel:camelContext id="myCamelContext">
        <camel:contextScan/>

        <camel:restConfiguration component="servlet" enableCORS="true" bindingMode="json" skipBindingOnErrorCode="false">
            <camel:endpointProperty key="httpBinding"                  value="myHttpBinding"/>
            <camel:corsHeaders      key="Access-Control-Allow-Methods" value="PATCH, PUT, POST, DELETE, GET, OPTIONS, HEAD"/>
            <camel:corsHeaders      key="Access-Control-Allow-Origin"  value="*"/>
            <camel:corsHeaders      key="Access-Control-Allow-Headers" value="*"/>
        </camel:restConfiguration>
    </camel:camelContext>
</beans>

Обратите внимание, что я удалил компонент настраиваемого сервлета, потому что в нем не было необходимости.

...