Showing posts with label transform. Show all posts
Showing posts with label transform. Show all posts

Friday, 11 June 2021

Spring integration: Transformers

Transformers are used to transform/convert a message. Using transformer you can

a.   Update the message payload

b.   Update the message headers etc.,

 

In general, transformers are used to convert the message payload from one format to other. For example,

a.   Xml to string

b.   Xml to json

c.    Json to xml

d.   Json to csv etc.,

 

Can a transformer modify the header values?

Yes, a transformer can add, remove, or modify the message’s header values.

 

@Transformer annotation is used to transform a message.

 

Example

@Transformer(inputChannel = "inputChannel", outputChannel = "outputChannel")
public Message<String> convertToUppercase(Message<String> message) {

	String payload = message.getPayload();

	Message<String> messageInUppercase = MessageBuilder.withPayload(payload.toUpperCase()).build();

	return messageInUppercase;

}

 

Above snippet transform the message to uppercase.

 

Step 1: Create new maven project ‘transformer-demo’.

 

Step 2: Update pom.xml with maven dependencies.

 

pom.xml

 

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.sample.app</groupId>
	<artifactId>transformer-demo</artifactId>
	<version>1</version>

	<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.4.0</version>
	</parent>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-integration</artifactId>
		</dependency>

	</dependencies>

</project>

 

Step 3: Define gateway.

 

CustomGateway.java
package com.sample.app.gateway;

import org.springframework.integration.annotation.Gateway;
import org.springframework.integration.annotation.MessagingGateway;
import org.springframework.messaging.Message;

@MessagingGateway
public interface CustomGateway {

	@Gateway(requestChannel = "inputChannel")
	public void print(Message<String> message);

}

 

Step 4: Define endpoint.

 

ConsumerEndpoint.java

 

package com.sample.app.endpoints;

import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;

@Component
public class ConsumerEndpoint {

	@ServiceActivator(inputChannel = "outputChannel")
	public void consumeStringMessage(Message<String> message) {
		System.out.println("Received message from outputChannel : " + message.getPayload());
	}
}

 

Step 5: Define application class.

 

App.java

 

package com.sample.app;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.Transformer;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;

import com.sample.app.gateway.CustomGateway;

@SpringBootApplication
@Configuration
public class App {

	@Transformer(inputChannel = "inputChannel", outputChannel = "outputChannel")
	public Message<String> convertToUppercase(Message<String> message) {

		String payload = message.getPayload();

		Message<String> messageInUppercase = MessageBuilder.withPayload(payload.toUpperCase()).build();

		return messageInUppercase;

	}

	@Autowired
	private CustomGateway customGateway;

	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}

	@Bean
	public CommandLineRunner demo() {
		return (args) -> {

			Message<String> msg = MessageBuilder.withPayload("i am in small letters, but will print in capital letters")
					.build();

			customGateway.print(msg);
		};

	};

}

 

Total project structure looks like below.



Run App.java, you will see below messages in console.

Received message from outputChannel : I AM IN SMALL LETTERS, BUT WILL PRINT IN CAPITAL LETTERS


You can download complete working application from below link.

https://github.com/harikrishna553/springboot/tree/master/spring-integration/transformer-demo


 

 

  

Previous                                                    Next                                                    Home

Tuesday, 21 April 2020

Transform Map to Map

Using Generics and Collections.toMap function we can convert Map<X, Y> to Map<X, Z>.

Below snippet takes a map of type <X,Y> and transform it to Map<X,Z> by applying a function on Y (f(Y) =Z).

public static <X, Y, Z> Map<X, Z> transform(Map<X, Y> input, Function<Y, Z> function) {
         return input.entrySet().stream()
                           .collect(Collectors.toMap((entry) -> entry.getKey(), (entry) -> function.apply(entry.getValue())));
}

Find the below working application.

App.java
package com.sample.app;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class App {

 public static <X, Y, Z> Map<X, Z> transform(Map<X, Y> input, Function<Y, Z> function) {
  return input.entrySet().stream()
    .collect(Collectors.toMap((entry) -> entry.getKey(), (entry) -> function.apply(entry.getValue())));
 }

 public static void main(String args[]) {

  @SuppressWarnings("unchecked")
  Map<Integer, String> map = new HashMap() {
   {
    put(1, "1");
    put(2, "4");
    put(3, "6");
   }

  };

  Map<Integer, Integer> result = transform(map, data -> Integer.parseInt(data));

  System.out.println("map : " + map);
  System.out.println("result : " + result);

 }

}

Output
map : {1=1, 2=4, 3=6}
result : {1=1, 2=4, 3=6}



You may like