diff --git a/pom.xml b/pom.xml
index 436145c46..a849350e8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -77,13 +77,6 @@
spring-boot-starter-actuator
-
-
- org.springframework.boot
- spring-boot-devtools
- true
-
-
org.springframework.security
diff --git a/src/main/java/edu/hawaii/its/groupings/configuration/LocalDevHotReloadConfig.java b/src/main/java/edu/hawaii/its/groupings/configuration/LocalDevHotReloadConfig.java
new file mode 100644
index 000000000..e5f86be35
--- /dev/null
+++ b/src/main/java/edu/hawaii/its/groupings/configuration/LocalDevHotReloadConfig.java
@@ -0,0 +1,32 @@
+package edu.hawaii.its.groupings.configuration;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Objects;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.io.ClassPathResource;
+import org.thymeleaf.TemplateEngine;
+import org.thymeleaf.templateresolver.FileTemplateResolver;
+
+@Configuration
+@Profile({"localhost", "dockerhost"})
+public class LocalDevHotReloadConfig {
+ public LocalDevHotReloadConfig(final TemplateEngine templateEngine) throws IOException {
+ final ClassPathResource applicationProp = new ClassPathResource("application.properties");
+ if (applicationProp.isFile()) {
+ File sourceRoot = applicationProp.getFile().getParentFile();
+ while (Objects.requireNonNull(sourceRoot.listFiles((dir, name) -> name.equals("mvnw"))).length != 1) {
+ sourceRoot = sourceRoot.getParentFile();
+ }
+ final FileTemplateResolver fileTemplateResolver = new FileTemplateResolver();
+ fileTemplateResolver.setPrefix(sourceRoot.getPath() + "/src/main/resources/templates/");
+ fileTemplateResolver.setSuffix(".html");
+ fileTemplateResolver.setCacheable(false);
+ fileTemplateResolver.setCharacterEncoding("UTF-8");
+ fileTemplateResolver.setCheckExistence(true);
+ templateEngine.setTemplateResolver(fileTemplateResolver);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/edu/hawaii/its/groupings/configuration/LocalDevHotReloadConfigTest.java b/src/test/java/edu/hawaii/its/groupings/configuration/LocalDevHotReloadConfigTest.java
new file mode 100644
index 000000000..0e11b1c13
--- /dev/null
+++ b/src/test/java/edu/hawaii/its/groupings/configuration/LocalDevHotReloadConfigTest.java
@@ -0,0 +1,50 @@
+package edu.hawaii.its.groupings.configuration;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.ActiveProfiles;
+import org.thymeleaf.TemplateEngine;
+import org.thymeleaf.templateresolver.FileTemplateResolver;
+import org.thymeleaf.templateresolver.ITemplateResolver;
+
+import java.io.IOException;
+
+@ActiveProfiles({ "localhost", "dockerhost" })
+public class LocalDevHotReloadConfigTest {
+
+ @MockBean
+ LocalDevHotReloadConfig localDevHotReloadConfig;
+
+ @Test
+ public void testConstructorWithValidTemplateEngine() throws IOException {
+ TemplateEngine templateEngine = spy(new TemplateEngine());
+ localDevHotReloadConfig = new LocalDevHotReloadConfig(templateEngine);
+ verify(templateEngine, times(1)).setTemplateResolver(any(ITemplateResolver.class));
+ }
+
+ @Test
+ public void testConstructorWithNullTemplateEngine() {
+ assertThrows(NullPointerException.class, () -> new LocalDevHotReloadConfig(null));
+ }
+
+ @Test
+ public void testConstructorConfiguresCorrectTemplateResolverProperties() throws IOException {
+ TemplateEngine templateEngine = new TemplateEngine();
+ localDevHotReloadConfig = new LocalDevHotReloadConfig(templateEngine);
+ ITemplateResolver resolver = templateEngine.getTemplateResolvers().iterator().next();
+ assertTrue(resolver instanceof FileTemplateResolver);
+ FileTemplateResolver fileResolver = (FileTemplateResolver) resolver;
+ assertFalse(fileResolver.isCacheable());
+ assertEquals("UTF-8", fileResolver.getCharacterEncoding());
+ assertTrue(fileResolver.getCheckExistence());
+ }
+}