30.4. 표현식

30.4.1. 개요

간단한 언어는 메시지 교환의 다른 부분을 반환하는 다양한 기본 표현식을 제공합니다. 예를 들어 simple("$header.timeOfDay}") 표현식은 수신 메시지에서 timeOfDay 라는 헤더의 내용을 반환합니다.

참고

Apache Camel 2.9부터 변수 값을 반환하려면 항상 자리 표시자 구문 ${Expression} 을 사용해야 합니다. enclosing 토큰(${})을 생략하는 것은 허용되지 않습니다.

30.4.2. 단일 변수의 콘텐츠

간단한 언어를 사용하여 제공된 변수에 따라 문자열 표현식을 정의할 수 있습니다. 예를 들어 양식의 변수를 사용하여 다음과 같이 HeaderName 헤더의 값을 가져올 수 있습니다.

simple("${in.header.foo}")

30.4.3. 문자열에 포함된 변수

예를 들어, string expression 전환에 간단한 변수를 포함할 수 있습니다.

simple("Received a message from ${in.header.user} on ${date:in.header.date:yyyyMMdd}.")

30.4.4. 날짜 및 Cryostat 변수

교환의 모든 부분에 액세스하는 변수( 표 30.1. “간단한 언어의 변수”참조)를 제공하는 것뿐만 아니라 간단한 언어에서는 형식 지정 날짜, date:pattern, meaning() 메서드 호출에 대한 특수 변수도 제공합니다. 예를 들어 다음과 같이 date 및 metrics 변수를 사용할 수 있습니다.

simple("Todays date is ${date:now:yyyyMMdd}")
simple("The order type is ${bean:orderService?method=getOrderType}")

30.4.5. 결과 유형 지정

표현식의 결과 유형을 명시적으로 지정할 수 있습니다. 이는 주로 결과 유형을 부울 또는 숫자 유형으로 변환하는 데 유용합니다.

Java DSL에서 결과 유형을 simple() 에 대한 추가 인수로 지정합니다. 예를 들어 정수 결과를 반환하려면 다음과 같이 간단한 표현식을 평가할 수 있습니다.

...
.setHeader("five", simple("5", Integer.class))

XML DSL에서 resultType 특성을 사용하여 결과 유형을 지정합니다. 예를 들면 다음과 같습니다.

<setHeader headerName="five">
  <!-- use resultType to indicate that the type should be a java.lang.Integer -->
  <simple resultType="java.lang.Integer">5</simple>
</setHeader>

30.4.6. 동적 헤더 키

Camel 2.17에서 setHeadersetExchange 속성을 사용하면 키 이름이 단순 언어 표현식인 경우 Simple 언어를 사용하여 동적 헤더 키를 사용할 수 있습니다.

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
      <setHeader headerName="$simple{type:org.apache.camel.spring.processor.SpringSetPropertyNameDynamicTest$TestConstans.EXCHANGE_PROP_TX_FAILED}">
        <simple>${type:java.lang.Boolean.TRUE}</simple>
      </setHeader>
    <to uri="mock:end"/>
  </route>
</camelContext>

30.4.7. 중첩된 표현식

단순 표현식은 nested Cryostat- Cryostat일 수 있습니다. 예를 들면 다음과 같습니다.

simple("${header.${bean:headerChooser?method=whichHeader}}")

30.4.8. 상수 또는 열거 액세스

다음 구문을 사용하여 Quarkus의 상수 또는 enum 필드에 액세스할 수 있습니다.

type:ClassName.Field

예를 들어 다음 Java enum 유형을 고려하십시오.

package org.apache.camel.processor;
...
public enum Customer {
    GOLD, SILVER, BRONZE
}

다음과 같이 Customer enum 필드에 액세스할 수 있습니다.

 from("direct:start")
    .choice()
        .when().simple("${header.customer} ==
          ${type:org.apache.camel.processor.Customer.GOLD}")
            .to("mock:gold")
        .when().simple("${header.customer} ==
          ${type:org.apache.camel.processor.Customer.SILVER}")
            .to("mock:silver")
        .otherwise()
            .to("mock:other");

30.4.9. OGNL 표현식

OGNL(오브젝트 그래프 탐색 언어)은 chain-like fashion으로 빈 메서드를 호출하기 위한 표기법입니다. 메시지 본문에 Java 8080이 포함된 경우 OGNL 표기법을 사용하여 빈 속성에 쉽게 액세스할 수 있습니다. 예를 들어 메시지 본문이 getAddress() 접근자가 있는 Java 개체인 경우 Address 개체 및 Address 오브젝트의 속성에 다음과 같이 액세스할 수 있습니다.

simple("${body.address}")
simple("${body.address.street}")
simple("${body.address.zip}")
simple("${body.address.city}")

여기서 표기법 ${body.address.street}${body.getAddress.getStreet}.의 약어입니다.

30.4.10. OGNL null-safe operator

null 안전 연산자( ? )를 사용하여 본문에 주소가 없는 경우 null 포인터 예외가 발생하지 않도록 할 수 있습니다. 예를 들면 다음과 같습니다.

simple("${body?.address?.street}")

본문이 java.util.Map 유형인 경우 다음 표기법을 사용하여 맵에서 키 foo 를 사용하여 값을 조회할 수 있습니다.

simple("${body[foo]?.name}")

30.4.11. OGNL 목록 요소 액세스

또한 대괄호 표기법을 사용하여 목록의 요소에 액세스할 수도 있습니다. 예를 들면 다음과 같습니다.

simple("${body.address.lines[0]}")
simple("${body.address.lines[1]}")
simple("${body.address.lines[2]}")

last 키워드는 목록의 마지막 요소의 인덱스를 반환합니다. 예를 들어 다음과 같이 목록의 두 번째 마지막 요소에 액세스할 수 있습니다.

simple("${body.address.lines[last-1]}")

size 방법을 사용하여 다음과 같이 목록 크기를 쿼리할 수 있습니다.

simple("${body.address.lines.size}")

30.4.12. OGNL 배열 길이 액세스

다음과 같이 길이 방법을 통해 Java 배열의 길이에 액세스할 수 있습니다.

String[] lines = new String[]{"foo", "bar", "cat"};
exchange.getIn().setBody(lines);

simple("There are ${body.length} lines")