49.15.2. Unmarshaling

from("file://inbox")
  .unmarshal(bindy)
  .to("direct:handleOrders");

또는 Spring XML 파일과 같이 레지스트리에 정의된 다음 데이터 형식에 대해 명명된 참조를 사용할 수 있습니다.

from("file://inbox")
  .unmarshal("myBindyDataFormat")
  .to("direct:handleOrders");

Camel 경로는 inbox 디렉터리의 파일 선택, unmarshall CSV 레코드를 모델 오브젝트 컬렉션으로 선택하고 컬렉션
을 'handleOrders'에서 참조하는 경로로 보냅니다.

반환된 컬렉션은 Map 오브젝트의 목록입니다. 목록의 각 맵에는 CSV의 각 줄에서 마샬링된 모델 개체가 포함되어 있습니다. 이 문제의 원인은 각 행이 두 개 이상의 오브젝트에 해당할 수 있기 때문입니다. 이는 단순히 한 줄에 하나의 개체가 반환될 것으로 예상하면 혼동될 수 있습니다.

각 오브젝트는 해당 클래스 이름을 사용하여 검색할 수 있습니다.

List<Map<String, Object>> unmarshaledModels = (List<Map<String, Object>>) exchange.getIn().getBody();

int modelCount = 0;
for (Map<String, Object> model : unmarshaledModels) {
  for (String className : model.keySet()) {
     Object obj = model.get(className);
     LOG.info("Count : " + modelCount + ", " + obj.toString());
  }
 modelCount++;
}

LOG.info("Total CSV records received by the csv bean : " + modelCount);

경로의 처리를 위해 이 맵에서 단일 Order 오브젝트를 추출하려는 경우 다음 내용에 따라 Splitter와 Processor의 조합을 사용할 수 있습니다.

from("file://inbox")
    .unmarshal(bindy)
    .split(body())
        .process(new Processor() {
            public void process(Exchange exchange) throws Exception {
                Message in = exchange.getIn();
                Map<String, Object> modelMap = (Map<String, Object>) in.getBody();
                in.setBody(modelMap.get(Order.class.getCanonicalName()));
            }
        })
        .to("direct:handleSingleOrder")
    .end();

Bindy는 unmarshalling을 위해 수신한 입력 스트림의 문자 세트 변환을 수행하기 위해 Exchange 인터페이스에서 정의된 사용자 이름 또는 CHARSET_NAME 헤더를 사용합니다. 일부 생산자(예: file-endpoint)에서는 문자 집합을 정의할 수 있습니다. 이 프로듀서의 변환은 이미 수행 할 수 있습니다. 때로는 unmarshal으로 보내기 전에 교환에서 이 속성 또는 헤더를 제거해야 합니다. 이를 제거하지 않으면 변환이 두 번 수행되어 원하지 않는 결과가 발생할 수 있습니다.

from("file://inbox?charset=Cp922")
  .removeProperty(Exchange.CHARSET_NAME)
  .unmarshal("myBindyDataFormat")
  .to("direct:handleOrders");