https://github.com/cepr0/sb-generic-strategy-resolver
Spring GenericStrategyResolver - 'resolves' generic Strategy implementations by its generic parameter
https://github.com/cepr0/sb-generic-strategy-resolver
generics resolver spring spring-boot strategy
Last synced: about 2 months ago
JSON representation
Spring GenericStrategyResolver - 'resolves' generic Strategy implementations by its generic parameter
- Host: GitHub
- URL: https://github.com/cepr0/sb-generic-strategy-resolver
- Owner: Cepr0
- Created: 2019-08-04T18:07:42.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2019-08-05T13:20:56.000Z (almost 7 years ago)
- Last Synced: 2025-03-11T07:19:09.751Z (over 1 year ago)
- Topics: generics, resolver, spring, spring-boot, strategy
- Language: Java
- Size: 24.4 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
Awesome Lists containing this project
README
# Spring GenericStrategyResolver
[GenericStrategyResolver][4] makes it possible to 'resolve' generic [Strategy][1] implementations by its generic parameter.
Assume we have some generic strategy:
```java
public interface TestStrategy {
String test(D data);
}
```
its generic parameter interface:
```java
public interface TestData {
}
```
two implementations of `TestData`:
```java
@Value
public class FirstData implements TestData {
private String first;
}
@Value
public class SecondData implements TestData {
private String second;
}
```
and their implementations of `TestStrategy`:
```java
@Component
public class FirstStrategy implements TestStrategy {
@Override
public String test(FirstData data) {
return data.getFirst();
}
}
@Component
public class SecondStrategy implements TestStrategy {
@Override
public String test(SecondData data) {
return data.getSecond();
}
}
```
Now if we register `GenericStrategyResolver` bean:
```java
@Bean
public GenericStrategyResolver resolver(Collection strategies) {
return new GenericStrategyResolver<>(strategies);
}
```
we will be able to get a concrete strategy by its generic parameter type:
```java
@Component
public class TestStrategyContext {
private final GenericStrategyResolver resolver;
public TestStrategyContext(GenericStrategyResolver resolver) {
this.resolver = resolver;
}
public Optional test(TestData data) {
return resolver.resolve(data.getClass())
.map(strategy -> {
//noinspection unchecked
return strategy.test(data);
});
}
}
```
See the usage example of `GenericStrategyResolver` in the package [demo][2] - it's a simple
REST service that takes POST requests with a different data and produces the different responses
and logging depends on the input data. Requests examples can be found in the [demo.http][3]
(you can run they right there, if you are using Intellij IDEA).
[1]: https://en.wikipedia.org/wiki/Strategy_pattern
[2]: src/main/java/io/github/cepr0/demo
[3]: demo.http
[4]: src/main/java/io/github/cepr0/resolver/GenericStrategyResolver.java