DATAREST-654 - Added suport for internationalization of enum values.

RepositoryRestConfiguration now exposes an option to enable enum value serialization and a nested configuration object to tweak the details.

If enabled, a Jackson serializer and deserializer is registered trying to resolve the enum values from the Spring Data REST resource bundle using the fully-qualified enum value name as key. If no explicitly configured value is configured a default translation is triggered that capitalizes the lowercased value name replacing the underscores with spaces (e.g. PAYMENT_EXPECTED -> Payment expected). This can be opted out of, of course.

On the parsing side the deserializer will also consult the resourcebundle and default translation but also accepting the enum name as is (also opt-outable).

Deprecated non-bean-style accessors for projection and metadata configuration on RepositoryRestConfiguration to make these options tweakable via Spring Boot application properties by default.
This commit is contained in:
Oliver Gierke
2015-08-20 16:16:07 +02:00
parent 39eb338025
commit 06b6b266db
21 changed files with 799 additions and 71 deletions

View File

@@ -17,8 +17,13 @@ package org.springframework.data.rest.core;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.junit.Before;
import org.junit.Test;
import org.springframework.data.rest.core.config.EnumTranslationConfiguration;
import org.springframework.data.rest.core.config.MetadataConfiguration;
import org.springframework.data.rest.core.config.ProjectionDefinitionConfiguration;
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
import org.springframework.http.MediaType;
@@ -30,14 +35,21 @@ import org.springframework.http.MediaType;
*/
public class RepositoryRestConfigurationUnitTests {
RepositoryRestConfiguration configuration;
@Before
public void setUp() {
this.configuration = new RepositoryRestConfiguration(new ProjectionDefinitionConfiguration(),
new MetadataConfiguration(), mock(EnumTranslationConfiguration.class));
}
/**
* @see DATAREST-34
*/
@Test
public void returnsBodiesIfAcceptHeaderPresentByDefault() {
RepositoryRestConfiguration configuration = new RepositoryRestConfiguration();
assertThat(configuration.returnBodyOnCreate(MediaType.APPLICATION_JSON_VALUE), is(true));
assertThat(configuration.returnBodyOnUpdate(MediaType.APPLICATION_JSON_VALUE), is(true));
}
@@ -48,8 +60,6 @@ public class RepositoryRestConfigurationUnitTests {
@Test
public void doesNotReturnBodiesIfNoAcceptHeaderPresentByDefault() {
RepositoryRestConfiguration configuration = new RepositoryRestConfiguration();
assertThat(configuration.returnBodyOnCreate(null), is(false));
assertThat(configuration.returnBodyOnUpdate(null), is(false));
}
@@ -60,8 +70,6 @@ public class RepositoryRestConfigurationUnitTests {
@Test
public void doesNotReturnBodiesIfEmptyAcceptHeaderPresentByDefault() {
RepositoryRestConfiguration configuration = new RepositoryRestConfiguration();
assertThat(configuration.returnBodyOnCreate(""), is(false));
assertThat(configuration.returnBodyOnUpdate(""), is(false));
}
@@ -72,7 +80,6 @@ public class RepositoryRestConfigurationUnitTests {
@Test
public void doesNotReturnBodyForUpdateIfExplicitlyDeactivated() {
RepositoryRestConfiguration configuration = new RepositoryRestConfiguration();
configuration.setReturnBodyOnUpdate(false);
assertThat(configuration.returnBodyOnUpdate(null), is(false));
@@ -86,7 +93,6 @@ public class RepositoryRestConfigurationUnitTests {
@Test
public void doesNotReturnBodyForCreateIfExplicitlyDeactivated() {
RepositoryRestConfiguration configuration = new RepositoryRestConfiguration();
configuration.setReturnBodyOnCreate(false);
assertThat(configuration.returnBodyOnCreate(null), is(false));
@@ -100,7 +106,6 @@ public class RepositoryRestConfigurationUnitTests {
@Test
public void returnsBodyForUpdateIfExplicitlyActivated() {
RepositoryRestConfiguration configuration = new RepositoryRestConfiguration();
configuration.setReturnBodyOnUpdate(true);
assertThat(configuration.returnBodyOnUpdate(null), is(true));
@@ -114,7 +119,6 @@ public class RepositoryRestConfigurationUnitTests {
@Test
public void returnsBodyForCreateIfExplicitlyActivated() {
RepositoryRestConfiguration configuration = new RepositoryRestConfiguration();
configuration.setReturnBodyOnCreate(true);
assertThat(configuration.returnBodyOnCreate(null), is(true));

View File

@@ -15,6 +15,8 @@
*/
package org.springframework.data.rest.core;
import static org.mockito.Mockito.*;
import java.util.Collections;
import java.util.List;
@@ -26,6 +28,9 @@ import org.springframework.context.annotation.Import;
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mapping.context.PersistentEntities;
import org.springframework.data.repository.support.Repositories;
import org.springframework.data.rest.core.config.EnumTranslationConfiguration;
import org.springframework.data.rest.core.config.MetadataConfiguration;
import org.springframework.data.rest.core.config.ProjectionDefinitionConfiguration;
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
import org.springframework.data.rest.core.domain.jpa.ConfiguredPersonRepository;
import org.springframework.data.rest.core.domain.jpa.JpaRepositoryConfig;
@@ -52,7 +57,8 @@ public class RepositoryTestsConfig {
@SuppressWarnings("deprecation")
@Bean
public RepositoryRestConfiguration config() {
RepositoryRestConfiguration config = new RepositoryRestConfiguration();
RepositoryRestConfiguration config = new RepositoryRestConfiguration(new ProjectionDefinitionConfiguration(),
new MetadataConfiguration(), mock(EnumTranslationConfiguration.class));
config.setResourceMappingForDomainType(Person.class).setRel("person");