diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/config/WebConfig.java b/spring-boot-ops/src/main/java/org/baeldung/boot/config/WebConfig.java index 6d8708b06a..6373553837 100644 --- a/spring-boot-ops/src/main/java/org/baeldung/boot/config/WebConfig.java +++ b/spring-boot-ops/src/main/java/org/baeldung/boot/config/WebConfig.java @@ -1,16 +1,17 @@ package org.baeldung.boot.config; +import java.util.List; + import org.baeldung.boot.converter.GenericBigDecimalConverter; +import org.baeldung.boot.converter.StringToAbstractEntityConverterFactory; import org.baeldung.boot.converter.StringToEmployeeConverter; -import org.baeldung.boot.converter.StringToEnumConverterFactory; +import org.baeldung.boot.converter.StringToEnumConverter; import org.baeldung.boot.web.resolver.HeaderVersionArgumentResolver; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import java.util.List; - @Configuration public class WebConfig implements WebMvcConfigurer { @@ -22,7 +23,8 @@ public class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToEmployeeConverter()); - registry.addConverterFactory(new StringToEnumConverterFactory()); + registry.addConverter(new StringToEnumConverter()); + registry.addConverterFactory(new StringToAbstractEntityConverterFactory()); registry.addConverter(new GenericBigDecimalConverter()); } } diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToAbstractEntityConverterFactory.java b/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToAbstractEntityConverterFactory.java new file mode 100644 index 0000000000..9e7fd8f858 --- /dev/null +++ b/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToAbstractEntityConverterFactory.java @@ -0,0 +1,39 @@ +package org.baeldung.boot.converter; + +import org.baeldung.boot.domain.AbstractEntity; +import org.baeldung.boot.domain.Bar; +import org.baeldung.boot.domain.Foo; +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.convert.converter.ConverterFactory; + +public class StringToAbstractEntityConverterFactory implements ConverterFactory{ + + @Override + public Converter getConverter(Class targetClass) { + + return new StringToAbstractEntityConverter<>(targetClass); + } + + + private static class StringToAbstractEntityConverter implements Converter { + + private Class targetClass; + + public StringToAbstractEntityConverter(Class targetClass) { + this.targetClass = targetClass; + } + + @Override + public T convert(String source) { + long id = Long.parseLong(source); + if(this.targetClass == Foo.class) { + return (T) new Foo(id); + } + else if(this.targetClass == Bar.class) { + return (T) new Bar(id); + } else { + return null; + } + } + } +} diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToEnumConverter.java b/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToEnumConverter.java new file mode 100644 index 0000000000..498b44abec --- /dev/null +++ b/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToEnumConverter.java @@ -0,0 +1,12 @@ +package org.baeldung.boot.converter; + +import org.baeldung.boot.domain.Modes; +import org.springframework.core.convert.converter.Converter; + +public class StringToEnumConverter implements Converter { + + @Override + public Modes convert(String from) { + return Modes.valueOf(from); + } +} \ No newline at end of file diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToEnumConverterFactory.java b/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToEnumConverterFactory.java deleted file mode 100644 index 6fa51bfdcc..0000000000 --- a/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToEnumConverterFactory.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.baeldung.boot.converter; - -import org.springframework.core.convert.converter.Converter; -import org.springframework.core.convert.converter.ConverterFactory; -import org.springframework.stereotype.Component; - -@Component -public class StringToEnumConverterFactory implements ConverterFactory { - - private static class StringToEnumConverter implements Converter { - - private Class enumType; - - public StringToEnumConverter(Class enumType) { - this.enumType = enumType; - } - - public T convert(String source) { - return (T) Enum.valueOf(this.enumType, source.trim()); - } - } - - @Override - public Converter getConverter(final Class targetType) { - return new StringToEnumConverter(targetType); - } -} diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/converter/controller/AbstractEntityController.java b/spring-boot-ops/src/main/java/org/baeldung/boot/converter/controller/AbstractEntityController.java new file mode 100644 index 0000000000..d3c012ba31 --- /dev/null +++ b/spring-boot-ops/src/main/java/org/baeldung/boot/converter/controller/AbstractEntityController.java @@ -0,0 +1,31 @@ +package org.baeldung.boot.converter.controller; + +import org.baeldung.boot.domain.Bar; +import org.baeldung.boot.domain.Foo; +import org.baeldung.boot.domain.Modes; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/string-to-abstract") +public class AbstractEntityController { + + @GetMapping("/foo/{foo}") + public ResponseEntity getStringToFoo(@PathVariable Foo foo) { + return ResponseEntity.ok(foo); + } + + @GetMapping("/bar/{bar}") + public ResponseEntity getStringToBar(@PathVariable Bar bar) { + return ResponseEntity.ok(bar); + } + + @GetMapping + public ResponseEntity getStringToMode(@RequestParam("mode") Modes mode) { + return ResponseEntity.ok(mode); + } +} diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/domain/AbstractEntity.java b/spring-boot-ops/src/main/java/org/baeldung/boot/domain/AbstractEntity.java new file mode 100644 index 0000000000..30e0d1e5fe --- /dev/null +++ b/spring-boot-ops/src/main/java/org/baeldung/boot/domain/AbstractEntity.java @@ -0,0 +1,10 @@ +package org.baeldung.boot.domain; + +public abstract class AbstractEntity { + + long id; + public AbstractEntity(long id){ + this.id = id; + } + +} diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/domain/Bar.java b/spring-boot-ops/src/main/java/org/baeldung/boot/domain/Bar.java new file mode 100644 index 0000000000..724f5e4bca --- /dev/null +++ b/spring-boot-ops/src/main/java/org/baeldung/boot/domain/Bar.java @@ -0,0 +1,29 @@ +package org.baeldung.boot.domain; + +public class Bar extends AbstractEntity { + + private int value; + + public Bar(long id) { + super(id); + } + + public Bar(long id, int value) { + super(id); + this.value = value; + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + @Override + public String toString() { + return "Bar [value=" + value + ", id=" + id + "]"; + } + +} diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/domain/Foo.java b/spring-boot-ops/src/main/java/org/baeldung/boot/domain/Foo.java new file mode 100644 index 0000000000..a2ff354e59 --- /dev/null +++ b/spring-boot-ops/src/main/java/org/baeldung/boot/domain/Foo.java @@ -0,0 +1,31 @@ +package org.baeldung.boot.domain; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric; +public class Foo extends AbstractEntity { + + private String name; + + public Foo(long id) { + super(id); + name = randomAlphanumeric(4); + } + + public Foo(long id, String name) { + super(id); + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "Foo [name=" + name + ", id=" + id + "]"; + } + +}