#apache-camel #base64 #javabeans
Вопрос:
Я использую компонент в своем контексте верблюда с классом org.apache.commons.configuration.Конфигурация базы данных, чтобы получить в качестве ключевого значения свойства, сохраненные в моей базе данных. Итак, значения поступают в base64, и мне нужно расшифровать значения, чтобы использовать их на моих маршрутах. Как я могу это сделать?
Ответ №1:
Например, инструменты Ocp и Kubernetes делают это внутри . Он передается в приложение путем декодирования закодированного текста. Вы все еще можете сделать это в camel. этот пример о шифровании и расшифровке с помощью библиотеки jasypt из книги camel. вы должны реализовать базовую PropertiesParser.class для base64 . Анализатор свойств базовый интерфейс . полный пример https://github.com/camelinaction/camelinaction2/blob/master/chapter14/configuration/src/test/java/camelinaction/SecuringConfigTest.java
JasyptPropertiesParser jasypt = new JasyptPropertiesParser();
// and set the master password
jasypt.setPassword("supersecret");
// we can avoid keeping the master password in plaintext in the application
// by referencing a environment variable
// export CAMEL_ENCRYPTION_PASSWORD=supersecret
// jasypt.setPassword("sysenv:CAMEL_ENCRYPTION_PASSWORD");
// setup the properties component to use the production file
PropertiesComponent prop = context.getComponent("properties", PropertiesComponent.class);
prop.setLocation("classpath:rider-test.properties");
// and use the jasypt properties parser so we can decrypt values
prop.setPropertiesParser(jasypt);
return context;
Ответ №2:
Вы можете попробовать использовать декодер Base64 из java.util
пакета и использовать его с компонентом, функцией обмена или процессором. Используйте Base64.getDecoder()
или Base64.getUrlDecoder()
для получения декодера, затем используйте декодер для декодирования строки base64 в массив байтов, который затем можно преобразовать в строку с верблюдами .convertBodyTo(String.class)
или просто создать новый экземпляр с new String(bytes, StandardCharsets.UTF_8);
package com.example;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Base64.Decoder;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
public class Base64tests extends CamelTestSupport {
@Test
public void Test() throws Exception {
MockEndpoint resultMockEndpoint = getMockEndpoint("mock:result");
resultMockEndpoint.expectedMessageCount(1);
resultMockEndpoint.message(0).body().isEqualTo("Hello World");
template.sendBody("direct:decodeBase64", "SGVsbG8gV29ybGQ=");
resultMockEndpoint.assertIsSatisfied();
}
@Override
protected RoutesBuilder createRouteBuilder() throws Exception {
return new RouteBuilder(){
@Override
public void configure() throws Exception {
from("direct:decodeBase64")
.routeId("decodeBase64")
.bean(new Base64Decoder())
.log("${body}")
.convertBodyTo(String.class)
.to("mock:result");
}
};
}
}
class Base64Decoder{
public byte[] decode(String encodedValue){
return Base64.getDecoder().decode(encodedValue);
}
}
Использование функции обмена:
.setBody().exchange( e -> {
String encodedBody = e.getMessage()
.getBody(String.class);
return Base64.getDecoder()
.decode(encodedBody);
})