10.2.3 Bộ chuyển đổi (Transformers)
Transformers thực hiện một số thao tác trên các message, thường dẫn đến một message khác và có thể là với kiểu payload khác (xem hình 10.4). Việc chuyển đổi có thể đơn giản, như thực hiện các phép toán trên một số hoặc thao tác với giá trị String. Hoặc có thể phức tạp hơn, chẳng hạn như sử dụng một giá trị String đại diện cho ISBN để tra cứu và trả về thông tin chi tiết của cuốn sách tương ứng.

Hình 10.4 Transformers thay đổi các message khi chúng đi qua luồng tích hợp.
Ví dụ, giả sử rằng các giá trị số nguyên đang được gửi lên một kênh có tên là numberChannel, và bạn muốn chuyển đổi những số đó thành một String chứa số La Mã tương ứng. Trong trường hợp đó, bạn có thể khai báo một bean kiểu GenericTransformer và đánh dấu nó bằng annotation @Transformer như sau:
@Bean
@Transformer(inputChannel="numberChannel",
outputChannel="romanNumberChannel")
public GenericTransformer<Integer, String> romanNumTransformer() {
return RomanNumbers::toRoman;
}Annotation @Transformer chỉ định bean này là một transformer bean nhận các giá trị Integer từ kênh tên numberChannel và sử dụng một phương thức tĩnh tên là toRoman() để thực hiện việc chuyển đổi. (Phương thức toRoman() được định nghĩa tĩnh trong một lớp tên là RomanNumbers và được tham chiếu ở đây bằng cú pháp tham chiếu phương thức.) Kết quả sẽ được gửi tới kênh tên romanNumberChannel.
Trong phong cách cấu hình Java DSL, việc này còn đơn giản hơn với lời gọi transform(), truyền vào tham chiếu đến phương thức toRoman() như sau:
@@Bean
public IntegrationFlow transformerFlow() {
return IntegrationFlows
...
.transform(RomanNumbers::toRoman)
...
.get();
}Mặc dù bạn đã sử dụng tham chiếu phương thức trong cả hai ví dụ transformer ở trên, hãy biết rằng transformer cũng có thể được định nghĩa bằng lambda. Hoặc, nếu transformer đủ phức tạp để xứng đáng có một lớp Java riêng, bạn có thể inject nó như một bean vào trong cấu hình luồng và truyền tham chiếu đó vào phương thức transform() như sau:
@Bean
public RomanNumberTransformer romanNumberTransformer() {
return new RomanNumberTransformer();
}
@Bean
public IntegrationFlow transformerFlow(
RomanNumberTransformer romanNumberTransformer) {
return IntegrationFlows
...
.transform(romanNumberTransformer)
...
.get();
}Tại đây, bạn khai báo một bean kiểu RomanNumberTransformer, bản thân nó là một triển khai của interface Transformer hoặc GenericTransformer của Spring Integration. Bean này được inject vào phương thức transformerFlow() và được truyền vào phương thức transform() khi định nghĩa luồng tích hợp.
