Objetivo
Nesse tutorial, será explicado como criar e utilizar funções customizadas do Jolt, ferramenta utilizada nesse projeto para manipular e converter JSON. Dentro do projeto “Winthor-integracao-core” foi criado uma package dentro de ‘infra’ com nome de ‘jolt.custom’ que permite a criação desses métodos customizados.
Entendendo o projeto:
As funções do Jolt podem ser executadas passando parâmetros para a função ou não. Por exemplo:
- =concat(@(1,value),@(1,key)) – recebe parâmetros para concatenar duas ou mais Strings;
- =toString – não recebe parâmetros, porém converte aquele atributo para uma String;
É importante ressaltar que essas funções customizadas funcionam somente até um nível a mais da árvore do JSON. Portanto, caso seja necessário usar em outro nível, deve utilizar a função de modify do Jolt, para levar essa informação para a camada correta, e depois fazer uso das funções customizadas.
Exemplo:
Nesse exemplo, a informação do teste é levada ao nível 1 da árvore do JSON, e depois é feita a operação de concatenar. Isso foi feito para poder exemplificar, porém a função de concatenar poderia ser sua função customizada.
Criando uma função customizada:
- Criar uma classe com o nome no formato ‘Jolt____.java’. Na package infra.jolt.custom.functions.impl;
- Sua classe deve ser anotada com o Bean @JoltCustomFunctionEnable para que ele possa ser compreendido pelo projeto;
- Sua classe deve implementar a interface JoltCustomFunction;
- Você deve implementar todos os métodos da interface;
- O método execute(Object value) tem como objetivo implementar a lógica das funções Jolt que não recebem parâmetro;
- Caso você não deseje implementar uma operação para esse cenário, você deve retornar o próprio atributo ‘value’. Caso isso não seja feito, pode causar uma exceção.
- Caso você não deseje implementar uma operação para esse cenário, você deve retornar o próprio atributo ‘value’. Caso isso não seja feito, pode causar uma exceção.
- O método execute(Map<String, Object> jsonValue, List<Object> parâmetros) tem como objetivo implementar a lógica das funções Jolt que recebem parâmetro;
- Caso você não queira implementar um método para quando for informado um parâmetro deve retornar null;
- Nos casos em que você quer usar só uma quantidade limitada de parâmetros, você pode acessa-lo através da função this.getValueParameterByIndex(INDEX, parâmetros). Sendo Index o número do index do parâmetro que você quer acessar. Exemplo:
- O método getFunctionName() tem como objetivo nomear sua operação customizada;
- Retornar uma String com o nome do método que será utilizado no Jolt customizado.
- Retornar uma String com o nome do método que será utilizado no Jolt customizado.
- O método execute(Object value) tem como objetivo implementar a lógica das funções Jolt que não recebem parâmetro;
- Alterar em /src/test/resources/Jolt/dados/dados-base64.json
- Esse json representa o json recebido pelo WSH e que irá ser convertido. Você pode adicionar um novo atributo para poder usar suas funções de conversão conforme próximo tópico.
- Esse json representa o json recebido pelo WSH e que irá ser convertido. Você pode adicionar um novo atributo para poder usar suas funções de conversão conforme próximo tópico.
- Alterar em /src/test/resources/Jolt/layout/layout0base0640decode.json
- Esse json é onde utiliza as funções Jolt para fazer as transformações. Nela você irá usar sua função customizada para verificar se as transformações estão funcionando conforme o esperado.
- Esse json é onde utiliza as funções Jolt para fazer as transformações. Nela você irá usar sua função customizada para verificar se as transformações estão funcionando conforme o esperado.
- Para testar, será necessário acessar a classe de teste em /src/test/java/winthorsmarthube.domain.transformador/TransformadorLayoutTest.java
- Executar essa classe no modo debug com um breakpoint na função ‘test()’ na linha do assert para verificar o atributo ‘dadosTransformados’. Caso a classe transformada esteja conforme o esperado, sua função está funcionando.
Como criar e testar funções customizadas:
Para exemplificar o processo, iremos criar uma função que retornar o horário atual, e poderá retornar em um formato especifico, caso seja informado no parâmetro.
- Criamos a classe JoltHorarioAtual.java
- Anotamos a classe com o bean @JoltCustomFunctionEnable e implementamos a interface JoltCustomFunction
- Implementamos os métodos obrigatórios da interface
- Quando formos utilizar nossa função, quero que seja chamado o método “=horarioAgora”.
- Para as regras, vou implementar o método caso não seja informado nenhum parâmetro retornando o localDateTime atual. Exemplo de uso dessa função “=horarioAgora” e irá retornar o valor: “2022-08-19 18:51:48”
- E caso ela queira me passar um formato de data especifico, ela deve passar os parâmetros. Conforme podemos ver, só o primeiro parâmetro será utilizado nessa função
- Para testar, vamos editar o arquivo dados-base64.json na package “src/test/resource/jolt/dados”
- E vamos editar nosso layout de teste na package “src/test/resource/jolt/layout”. Inicialmente, vamos fazer a operação sem passar parâmetros e sobre escrevendo o ‘horarioAntes’.
- Verificando no debug do nosso teste, vemos que o Jolt transformado contem nossa variável ‘horarioAntes’ com o valor atual.
- Agora para testar a versão em que é passado o parâmetro de formato de data esperado, vamos alterar nosso layout de transformação Jolt de teste para um formato diferente.
- E ao executar com o debug, vemos que o formato retornado foi conforme informado no layout.