Символ спецификации (Byte Order Mark) — это невидимый символ, расположенный в начале текстового файла. Машина может идентифицировать символ спецификации по шестнадцатеричной последовательности байтов, но для пользователя символ спецификации невидим.
Apache Camel имеет компонент проверки, который игнорирует символы спецификации, если они появляются в начале файла, но компонент не игнорирует символы спецификации, если они появляются в другом месте. Это может привести к сбоям в приложении. Например, когда мы используем разделитель и агрегатор, сообщение об обмене можно упорядочить по-разному после завершения агрегации (т. Е. Символ спецификации находится не в начале файла, а где-то еще).
Вам также может понравиться:
Как преобразовать Java-бин любого типа с помощью BULL .
Чтобы избежать сбоев на основе символов спецификации, мы создаем Java Bean, который сканирует сообщение обмена для символа спецификации по шестнадцатеричному коду и заменяет его пустой строкой.
Джава
1
public void detectBomCharacter(Exchange exchange) {
2
String newBody = ((String)exchange.getIn().getBody()).replaceAll("\\uFEFF", "");
3
exchange.getMessage().setBody((newBody));
4
}
Тест с использованием JUnit Jupiter может выглядеть следующим образом:
Джава
xxxxxxxxxx
1
import org.apache.camel.Exchange;
2
import org.apache.camel.support.DefaultExchange;
3
import org.apache.camel.impl.DefaultCamelContext;
4
import org.junit.jupiter.api.Test;
5
import static org.junit.jupiter.api.Assertions.assertEquals;
6
class BomProcessor{
8
Exchange exchange;
9
BomProcessor bomProcessor;
10
public void setUp(){
12
exchange = new DefaultExchange(new DefaultCamelContext());
13
bomProcessor = new BomProcessor ();
14
}
15
17
public void shouldRemoveBomCharacter() {
18
exchange.getIn().setBody("\uFEFFTest\uFEFF to remove\uFEFF BOM.\uFEFF");
19
bomProcessor.removeBomCharacter(exchange);
20
assertEquals("Test to remove BOM.", exchange.getMessage().getBody());
21
}
22
}
23