diff --git a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/WebMvcConfig.java b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/WebMvcConfig.java new file mode 100644 index 000000000..9169f6099 --- /dev/null +++ b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/WebMvcConfig.java @@ -0,0 +1,55 @@ +package pro.taskana.rest; + +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; + +@Configuration +@EnableWebMvc +public class WebMvcConfig implements WebMvcConfigurer { + + private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { + "classpath:/META-INF/resources/", "classpath:/resources/", + "classpath:/static/", "classpath:/public/"}; + + @Autowired + private ObjectMapper objectMapper; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + if (!registry.hasMappingForPattern("/webjars/**")) { + registry.addResourceHandler("/webjars/**").addResourceLocations( + "classpath:/META-INF/resources/webjars/"); + } + if (!registry.hasMappingForPattern("/**")) { + registry.addResourceHandler("/**").addResourceLocations( + CLASSPATH_RESOURCE_LOCATIONS); + } + } + + @Override + public void extendMessageConverters(List> converters) { + for (HttpMessageConverter converter : converters) { + if (converter instanceof MappingJackson2HttpMessageConverter) { + MappingJackson2HttpMessageConverter jacksonConverter = (MappingJackson2HttpMessageConverter) converter; + jacksonConverter.setPrettyPrint(true); + } + } + } + + @PostConstruct + public void enableObjectIndent() { + objectMapper.enable(SerializationFeature.INDENT_OUTPUT); + } +} diff --git a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/controllers/ViewController.java b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/controllers/ViewController.java index afe86d5d7..3876327d1 100644 --- a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/controllers/ViewController.java +++ b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/controllers/ViewController.java @@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.RequestMapping; @Controller public class ViewController { - @RequestMapping({"/administration*/**", "/workplace*/**", "/monitor*/**", "/no-role*/**"}) + @RequestMapping({"", "/administration*/**", "/workplace*/**", "/monitor*/**", "/no-role*/**"}) public String index() { return "forward:/index.html"; } diff --git a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/security/WebSecurityConfig.java b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/security/WebSecurityConfig.java index 9fcbb7c33..e0dc01819 100644 --- a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/security/WebSecurityConfig.java +++ b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/security/WebSecurityConfig.java @@ -103,6 +103,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .anyRequest().fullyAuthenticated() .and() .formLogin().loginPage("/login").failureUrl("/login?error") + .defaultSuccessUrl("/") .permitAll() .and() .logout() diff --git a/rest/taskana-rest-spring-example/src/main/resources/static/img/favicon.ico b/rest/taskana-rest-spring-example/src/main/resources/static/img/favicon.ico new file mode 100644 index 000000000..4e4059fc9 Binary files /dev/null and b/rest/taskana-rest-spring-example/src/main/resources/static/img/favicon.ico differ diff --git a/rest/taskana-rest-spring-example/src/main/resources/templates/login.html b/rest/taskana-rest-spring-example/src/main/resources/templates/login.html index 0f78f1728..687932277 100644 --- a/rest/taskana-rest-spring-example/src/main/resources/templates/login.html +++ b/rest/taskana-rest-spring-example/src/main/resources/templates/login.html @@ -1,6 +1,9 @@ + Taskana login diff --git a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/TaskControllerIntTest.java b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/TaskControllerIntTest.java index 9d48ead7c..eea6c97bd 100644 --- a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/TaskControllerIntTest.java +++ b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/TaskControllerIntTest.java @@ -43,6 +43,7 @@ import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import pro.taskana.exceptions.SystemException; @@ -299,6 +300,7 @@ public class TaskControllerIntTest { con.setRequestMethod("GET"); con.setRequestProperty("Authorization", "Basic YWRtaW46YWRtaW4="); assertEquals(200, con.getResponseCode()); + ObjectMapper objectMapper = new ObjectMapper(); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); @@ -310,11 +312,11 @@ public class TaskControllerIntTest { in.close(); con.disconnect(); String response = content.toString(); + JsonNode jsonNode = objectMapper.readTree(response); + String created = jsonNode.get("created").asText(); assertFalse(response.contains("\"attachments\":[]")); - int start = response.indexOf("created", response.indexOf("created") + 1); - String createdString = response.substring(start + 10, start + 30); assertTrue( - createdString.matches("\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z)")); + created.matches("\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z)")); } @Test diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/RestConfiguration.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/RestConfiguration.java index d68007a9b..5a0675eb8 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/RestConfiguration.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/RestConfiguration.java @@ -1,7 +1,6 @@ package pro.taskana.rest; import java.sql.SQLException; -import java.util.List; import javax.sql.DataSource; @@ -12,11 +11,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.json.SpringHandlerInstantiator; import org.springframework.transaction.annotation.EnableTransactionManagement; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import com.fasterxml.jackson.databind.cfg.HandlerInstantiator; @@ -35,7 +31,7 @@ import pro.taskana.ldap.LdapClient; @Configuration @ComponentScan @EnableTransactionManagement -public class RestConfiguration extends WebMvcConfigurationSupport { +public class RestConfiguration{ @Value("${taskana.schemaName:TASKANA}") private String schemaName; @@ -83,13 +79,4 @@ public class RestConfiguration extends WebMvcConfigurationSupport { return new SpringHandlerInstantiator(context.getAutowireCapableBeanFactory()); } - @Override - protected void extendMessageConverters(List> converters) { - for (HttpMessageConverter converter : converters) { - if (converter instanceof MappingJackson2HttpMessageConverter) { - MappingJackson2HttpMessageConverter jacksonConverter = (MappingJackson2HttpMessageConverter) converter; - jacksonConverter.setPrettyPrint(true); - } - } - } }