48.15. Java DSL 사용
다음 단계는 이 레코드 유형과 연관된 DataFormat 바인딩 클래스를 인스턴스화하고 Java 패키지 이름을 매개 변수로 제공하는 것입니다.
예를 들어 다음에서는 com.acme.model 패키지 이름으로 구성된 BindyCsvDataFormat
(이 패키지에 구성된 모델 오브젝트를 초기화하기 위해 com.acme.model
패키지 이름과 연결된 클래스에 해당)을 사용합니다.
// Camel 2.15 or older (configure by package name) DataFormat bindy = new BindyCsvDataFormat("com.acme.model"); // Camel 2.16 onwards (configure by class name) DataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class);
48.15.1. 로케일 설정
Bindy는 다음과 같은 데이터 형식에서 로케일 구성을 지원합니다.
// Camel 2.15 or older (configure by package name) BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.acme.model"); // Camel 2.16 onwards (configure by class name) BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class); bindy.setLocale("us");
또는 플랫폼 기본 로케일을 사용하려면 "default"를 로케일 이름으로 사용합니다. 여기에는 Camel 2.14/2.13.3/2.12.5가 필요합니다.
// Camel 2.15 or older (configure by package name) BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.acme.model"); // Camel 2.16 onwards (configure by class name) BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class); bindy.setLocale("default");
이전 릴리스의 경우 다음과 같이 Java 코드를 사용하여 설정할 수 있습니다.
// Camel 2.15 or older (configure by package name) BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.acme.model"); // Camel 2.16 onwards (configure by class name) BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.acme.model.MyModel.class); bindy.setLocale(Locale.getDefault().getISO3Country());
48.15.2. unmarshaling
from("file://inbox") .unmarshal(bindy) .to("direct:handleOrders");
또는 Spring XML 파일 등 레지스트리에 정의할 수 있는 데이터 형식에 대해 이름 지정된 참조를 사용할 수 있습니다.
from("file://inbox") .unmarshal("myBindyDataFormat") .to("direct:handleOrders");
Camel 경로는 받은 편지함 디렉터리에서 파일을 선택하며, CSV 레코드를 model 오브젝트 모음으로 분리하고, 'handleOrders'에서 참조하는 경로로 모음
를 보냅니다.
반환된 컬렉션은 Map 오브젝트의 List 입니다. 목록의 각 맵에는 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가 Exchange 인터페이스에 정의된 것으로 Bindy 속성 또는ECDHESET_NAME 헤더를 사용하여 unmarshalling을 위해 수신된 입력 스트림의 문자 집합 변환을 수행합니다. 일부 생산자(예: 파일 엔드 포인트)에서는 문자 세트를 정의할 수 있습니다. 문자 세트 변환은 이 프로듀서에서 이미 수행할 수 있습니다. 때때로 unmarshal으로 보내기 전에 이 속성 또는 헤더를 교환에서 제거해야 하는 경우가 있습니다. 이를 제거하지 않으면 변환이 두 번 수행되어 원치 않는 결과가 발생할 수 있습니다.
from("file://inbox?charset=Cp922") .removeProperty(Exchange.CHARSET_NAME) .unmarshal("myBindyDataFormat") .to("direct:handleOrders");
48.15.3. marshaling
모델 오브젝트 컬렉션에서 CSV 레코드를 생성하려면 다음 경로를 생성합니다.
from("direct:handleOrders") .marshal(bindy) .to("file://outbox")