diff --git a/spring-katharsis/.classpath b/spring-katharsis/.classpath
new file mode 100644
index 0000000000..9ae7bca0fc
--- /dev/null
+++ b/spring-katharsis/.classpath
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-katharsis/.project b/spring-katharsis/.project
new file mode 100644
index 0000000000..03ad78567d
--- /dev/null
+++ b/spring-katharsis/.project
@@ -0,0 +1,29 @@
+
+
+ spring-katharsis
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.springframework.ide.eclipse.core.springbuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.springframework.ide.eclipse.core.springnature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/spring-katharsis/.springBeans b/spring-katharsis/.springBeans
new file mode 100644
index 0000000000..b854542b58
--- /dev/null
+++ b/spring-katharsis/.springBeans
@@ -0,0 +1,13 @@
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-katharsis/pom.xml b/spring-katharsis/pom.xml
new file mode 100644
index 0000000000..554ff4e656
--- /dev/null
+++ b/spring-katharsis/pom.xml
@@ -0,0 +1,75 @@
+
+ 4.0.0
+ org.springframework.samples
+ spring-katharsis
+ 0.0.1-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.2.6.RELEASE
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+ com.h2database
+ h2
+
+
+
+
+
+ io.katharsis
+ katharsis-servlet
+ 1.0.0
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ com.jayway.restassured
+ rest-assured
+ 2.4.0
+ test
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+
+
+
+
+ 1.8
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/spring-katharsis/src/main/java/org/baeldung/Application.java b/spring-katharsis/src/main/java/org/baeldung/Application.java
new file mode 100644
index 0000000000..1b409f8b91
--- /dev/null
+++ b/spring-katharsis/src/main/java/org/baeldung/Application.java
@@ -0,0 +1,14 @@
+package org.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+
+ }
+
+}
\ No newline at end of file
diff --git a/spring-katharsis/src/main/java/org/baeldung/Setup.java b/spring-katharsis/src/main/java/org/baeldung/Setup.java
new file mode 100644
index 0000000000..c371c16d5b
--- /dev/null
+++ b/spring-katharsis/src/main/java/org/baeldung/Setup.java
@@ -0,0 +1,25 @@
+package org.baeldung;
+
+import javax.annotation.PostConstruct;
+
+import org.baeldung.persistence.dao.UserRepository;
+import org.baeldung.persistence.model.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Setup {
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @PostConstruct
+ private void setupData() {
+ final User user = new User();
+ user.setFirstName("john");
+ user.setLastName("doe");
+ user.setEmail("john@test.com");
+ userRepository.save(user);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-katharsis/src/main/java/org/baeldung/persistence/dao/UserRepository.java b/spring-katharsis/src/main/java/org/baeldung/persistence/dao/UserRepository.java
new file mode 100644
index 0000000000..cfe857ec40
--- /dev/null
+++ b/spring-katharsis/src/main/java/org/baeldung/persistence/dao/UserRepository.java
@@ -0,0 +1,8 @@
+package org.baeldung.persistence.dao;
+
+import org.baeldung.persistence.model.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface UserRepository extends JpaRepository {
+
+}
diff --git a/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/JsonApiFilter.java b/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/JsonApiFilter.java
new file mode 100644
index 0000000000..dc07841fe6
--- /dev/null
+++ b/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/JsonApiFilter.java
@@ -0,0 +1,40 @@
+package org.baeldung.persistence.katharsis;
+
+import io.katharsis.invoker.KatharsisInvokerBuilder;
+import io.katharsis.locator.JsonServiceLocator;
+import io.katharsis.servlet.AbstractKatharsisFilter;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.BeanFactoryAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class JsonApiFilter extends AbstractKatharsisFilter implements BeanFactoryAware {
+
+ private static final String DEFAULT_RESOURCE_SEARCH_PACKAGE = "org.baeldung.persistence";
+
+ private static final String RESOURCE_DEFAULT_DOMAIN = "http://localhost:8080";
+
+ private BeanFactory beanFactory;
+
+ @Override
+ public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
+ this.beanFactory = beanFactory;
+ }
+
+ @Override
+ protected KatharsisInvokerBuilder createKatharsisInvokerBuilder() {
+ final KatharsisInvokerBuilder builder = new KatharsisInvokerBuilder();
+
+ builder.resourceSearchPackage(DEFAULT_RESOURCE_SEARCH_PACKAGE).resourceDefaultDomain(RESOURCE_DEFAULT_DOMAIN).jsonServiceLocator(new JsonServiceLocator() {
+ @Override
+ public T getInstance(Class clazz) {
+ return beanFactory.getBean(clazz);
+ }
+ });
+
+ return builder;
+ }
+
+}
diff --git a/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/UserResourceRepository.java b/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/UserResourceRepository.java
new file mode 100644
index 0000000000..4c7ce70765
--- /dev/null
+++ b/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/UserResourceRepository.java
@@ -0,0 +1,42 @@
+package org.baeldung.persistence.katharsis;
+
+import io.katharsis.queryParams.RequestParams;
+import io.katharsis.repository.ResourceRepository;
+
+import org.baeldung.persistence.dao.UserRepository;
+import org.baeldung.persistence.model.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class UserResourceRepository implements ResourceRepository {
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @Override
+ public User findOne(Long id, RequestParams params) {
+ return userRepository.findOne(id);
+ }
+
+ @Override
+ public Iterable findAll(RequestParams params) {
+ return userRepository.findAll();
+ }
+
+ @Override
+ public Iterable findAll(Iterable ids, RequestParams params) {
+ return userRepository.findAll(ids);
+ }
+
+ @Override
+ public S save(S entity) {
+ return userRepository.save(entity);
+ }
+
+ @Override
+ public void delete(Long id) {
+ userRepository.delete(id);
+ }
+
+}
diff --git a/spring-katharsis/src/main/java/org/baeldung/persistence/model/User.java b/spring-katharsis/src/main/java/org/baeldung/persistence/model/User.java
new file mode 100644
index 0000000000..c0a04ac344
--- /dev/null
+++ b/spring-katharsis/src/main/java/org/baeldung/persistence/model/User.java
@@ -0,0 +1,91 @@
+package org.baeldung.persistence.model;
+
+import io.katharsis.resource.annotations.JsonApiId;
+import io.katharsis.resource.annotations.JsonApiResource;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+@JsonApiResource(type = "users")
+public class User {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @JsonApiId
+ private Long id;
+
+ private String firstName;
+
+ private String lastName;
+
+ private String email;
+
+ public User() {
+ super();
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(final Long id) {
+ this.id = id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(final String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(final String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(final String username) {
+ email = username;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + (email == null ? 0 : email.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final User user = (User) obj;
+ if (!email.equals(user.email))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder builder = new StringBuilder();
+ builder.append("User [firstName=").append(firstName).append("]").append("[lastName=").append(lastName).append("]").append("[username").append(email).append("]");
+ return builder.toString();
+ }
+
+}
\ No newline at end of file
diff --git a/spring-katharsis/src/main/resources/application.properties b/spring-katharsis/src/main/resources/application.properties
new file mode 100644
index 0000000000..25d4559e3d
--- /dev/null
+++ b/spring-katharsis/src/main/resources/application.properties
@@ -0,0 +1,6 @@
+spring.datasource.url = jdbc:h2:mem:springKatharsis;DB_CLOSE_DELAY=-1
+spring.datasource.username = sa
+spring.datasource.password =
+spring.jpa.show-sql = false
+spring.jpa.hibernate.ddl-auto = create-drop
+spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect
\ No newline at end of file
diff --git a/spring-katharsis/src/test/java/org/baeldung/test/JsonApiLiveTest.java b/spring-katharsis/src/test/java/org/baeldung/test/JsonApiLiveTest.java
new file mode 100644
index 0000000000..bbddba3490
--- /dev/null
+++ b/spring-katharsis/src/test/java/org/baeldung/test/JsonApiLiveTest.java
@@ -0,0 +1,29 @@
+package org.baeldung.test;
+
+import static org.junit.Assert.assertEquals;
+
+import org.baeldung.Application;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.SpringApplicationConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+
+import com.jayway.restassured.RestAssured;
+import com.jayway.restassured.response.Response;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringApplicationConfiguration(classes = Application.class)
+@WebAppConfiguration
+public class JsonApiLiveTest {
+
+ private final static String URL_PREFIX = "http://localhost:8080/users";
+
+ @Test
+ public void whenGettingAllUsers_thenCorrect() {
+ final Response response = RestAssured.get(URL_PREFIX);
+ assertEquals(200, response.statusCode());
+ System.out.println(response.asString());
+ }
+
+}