DATAJDBC-430 - Polishing.

Renames *Bean annotation attributes to *Ref to match other similar attributes.
Removes additional arguments from constructors of public classes in order to avoid breaking the API.
Gathers application context configuration for StringBasedJdbcQueryMappingConfigurationIntegrationTests in a single java file.
Formatting.
Adds the author tag.
Changes default value of references to the empty String.

Original pull request: #249.
This commit is contained in:
Jens Schauder
2020-10-09 14:33:03 +02:00
parent c356a8ca41
commit 1b1395ab73
12 changed files with 178 additions and 161 deletions

View File

@@ -32,7 +32,6 @@ import org.assertj.core.groups.Tuple;
import org.junit.Before;
import org.junit.Test;
import org.mockito.stubbing.Answer;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.annotation.Id;
import org.springframework.data.domain.PageRequest;
@@ -83,7 +82,6 @@ public class SimpleJdbcRepositoryEventsUnitTests {
DummyEntityRepository repository;
DefaultDataAccessStrategy dataAccessStrategy;
BeanFactory beanFactory = mock(BeanFactory.class);
@Before
public void before() {
@@ -101,7 +99,7 @@ public class SimpleJdbcRepositoryEventsUnitTests {
doReturn(true).when(dataAccessStrategy).update(any(), any());
JdbcRepositoryFactory factory = new JdbcRepositoryFactory(dataAccessStrategy, context, converter,
H2Dialect.INSTANCE, publisher, operations, beanFactory);
H2Dialect.INSTANCE, publisher, operations);
this.repository = factory.getRepository(DummyEntityRepository.class);
}

View File

@@ -15,8 +15,11 @@
*/
package org.springframework.data.jdbc.repository;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.data.jdbc.testing.SingleBaseMappingTestConfiguration.VALUE_PROCESSED_BY_SERVICE;
import static java.util.Collections.*;
import static org.assertj.core.api.Assertions.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -31,13 +34,14 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.dao.DataAccessException;
import org.springframework.data.annotation.Id;
import org.springframework.data.jdbc.repository.config.DefaultQueryMappingConfiguration;
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.jdbc.testing.SingleBaseMappingTestConfiguration.Car;
import org.springframework.data.jdbc.testing.TestConfiguration;
import org.springframework.data.repository.CrudRepository;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.rules.SpringClassRule;
@@ -48,12 +52,14 @@ import org.springframework.transaction.annotation.Transactional;
* Very simple use cases for creation and usage of {@link ResultSetExtractor}s in JdbcRepository.
*
* @author Evgeni Dimitrov
* @author Hebert Coelho
*/
@ContextConfiguration
@Transactional
public class StringBasedJdbcQueryMappingConfigurationIntegrationTests {
private final static String CAR_MODEL = "ResultSetExtractor Car";
private final static String VALUE_PROCESSED_BY_SERVICE = "Value Processed by Service";
@Configuration
@Import(TestConfiguration.class)
@@ -69,6 +75,76 @@ public class StringBasedJdbcQueryMappingConfigurationIntegrationTests {
QueryMappingConfiguration mappers() {
return new DefaultQueryMappingConfiguration();
}
@Bean(value = "CarResultSetExtractorBean")
public CarResultSetExtractorBean resultSetExtractorBean() {
return new CarResultSetExtractorBean();
}
@Bean
public CustomerService service() {
return new CustomerService();
}
@Bean(value = "CustomRowMapperBean")
public CustomRowMapperBean rowMapperBean() {
return new CustomRowMapperBean();
}
}
public static class CarResultSetExtractorBean implements ResultSetExtractor<List<Car>> {
@Autowired private CustomerService customerService;
@Override
public List<Car> extractData(ResultSet rs) throws SQLException, DataAccessException {
return Arrays.asList(new Car(1L, customerService.process()));
}
}
public static class CustomRowMapperBean implements RowMapper<String> {
@Autowired private CustomerService customerService;
public String mapRow(ResultSet rs, int rowNum) throws SQLException {
return customerService.process();
}
}
public static class CustomerService {
public String process() {
return VALUE_PROCESSED_BY_SERVICE;
}
}
@Data
@AllArgsConstructor
public static class Car {
@Id private Long id;
private String model;
}
static class CarResultSetExtractor implements ResultSetExtractor<List<Car>> {
@Override
public List<Car> extractData(ResultSet rs) throws SQLException, DataAccessException {
return singletonList(new Car(1L, CAR_MODEL));
}
}
interface CarRepository extends CrudRepository<Car, Long> {
@Query(value = "select * from car", resultSetExtractorClass = CarResultSetExtractor.class)
List<Car> customFindAll();
@Query(value = "select * from car", resultSetExtractorRef = "CarResultSetExtractorBean")
List<Car> findByNameWithResultSetExtractor();
@Query(value = "select model from car", rowMapperRef = "CustomRowMapperBean")
List<String> findByNameWithRowMapperBean();
}
@ClassRule public static final SpringClassRule classRule = new SpringClassRule();
@@ -88,7 +164,8 @@ public class StringBasedJdbcQueryMappingConfigurationIntegrationTests {
}
@Test // DATAJDBC-430
public void customFindWithRowMapperSupportingInjection() {
public void customFindWithRowMapperBeanSupportingInjection() {
carRepository.save(new Car(null, "Some model"));
List<String> names = carRepository.findByNameWithRowMapperBean();
@@ -97,7 +174,8 @@ public class StringBasedJdbcQueryMappingConfigurationIntegrationTests {
}
@Test // DATAJDBC-430
public void customFindWithResultSetExtractorSupportingInjection() {
public void customFindWithResultSetExtractorBeanSupportingInjection() {
carRepository.save(new Car(null, "Some model"));
Iterable<Car> cars = carRepository.findByNameWithResultSetExtractor();
@@ -105,22 +183,4 @@ public class StringBasedJdbcQueryMappingConfigurationIntegrationTests {
assertThat(cars).allMatch(car -> VALUE_PROCESSED_BY_SERVICE.equals(car.getModel()));
}
static class CarResultSetExtractor implements ResultSetExtractor<List<Car>> {
@Override
public List<Car> extractData(ResultSet rs) throws SQLException, DataAccessException {
return Arrays.asList(new Car(1L, CAR_MODEL));
}
}
private interface CarRepository extends CrudRepository<Car, Long> {
@Query(value = "select * from car", resultSetExtractorClass = CarResultSetExtractor.class)
List<Car> customFindAll();
@Query(value = "select * from car", resultSetExtractorBean = "CarResultSetExtractorBean")
List<Car> findByNameWithResultSetExtractor();
@Query(value = "select model from car", rowMapperBean = "CustomRowMapperBean")
List<String> findByNameWithRowMapperBean();
}
}

View File

@@ -21,6 +21,7 @@ import static org.mockito.Mockito.*;
import java.sql.ResultSet;
import org.assertj.core.api.Assertions;
import org.jetbrains.annotations.NotNull;
import org.junit.Before;
import org.junit.Test;
@@ -54,7 +55,6 @@ public class StringBasedJdbcQueryUnitTests {
NamedParameterJdbcOperations operations;
RelationalMappingContext context;
JdbcConverter converter;
BeanFactory beanFactory;
@Before
public void setup() throws NoSuchMethodException {
@@ -69,7 +69,6 @@ public class StringBasedJdbcQueryUnitTests {
this.operations = mock(NamedParameterJdbcOperations.class);
this.context = mock(RelationalMappingContext.class, RETURNS_DEEP_STUBS);
this.converter = new BasicJdbcConverter(context, mock(RelationResolver.class));
this.beanFactory = mock(BeanFactory.class);
}
@Test // DATAJDBC-165
@@ -78,16 +77,23 @@ public class StringBasedJdbcQueryUnitTests {
doReturn(null).when(queryMethod).getDeclaredQuery();
Assertions.assertThatExceptionOfType(IllegalStateException.class) //
.isThrownBy(() -> new StringBasedJdbcQuery(queryMethod, operations, defaultRowMapper, converter, beanFactory)
.isThrownBy(() -> createQuery()
.execute(new Object[] {}));
}
@NotNull
private StringBasedJdbcQuery createQuery() {
StringBasedJdbcQuery query = new StringBasedJdbcQuery(queryMethod, operations, defaultRowMapper, converter);
return query;
}
@Test // DATAJDBC-165
public void defaultRowMapperIsUsedByDefault() {
doReturn("some sql statement").when(queryMethod).getDeclaredQuery();
doReturn(RowMapper.class).when(queryMethod).getRowMapperClass();
StringBasedJdbcQuery query = new StringBasedJdbcQuery(queryMethod, operations, defaultRowMapper, converter, beanFactory);
StringBasedJdbcQuery query = createQuery();
assertThat(query.determineRowMapper(defaultRowMapper)).isEqualTo(defaultRowMapper);
}
@@ -96,7 +102,7 @@ public class StringBasedJdbcQueryUnitTests {
public void defaultRowMapperIsUsedForNull() {
doReturn("some sql statement").when(queryMethod).getDeclaredQuery();
StringBasedJdbcQuery query = new StringBasedJdbcQuery(queryMethod, operations, defaultRowMapper, converter, beanFactory);
StringBasedJdbcQuery query = createQuery();
assertThat(query.determineRowMapper(defaultRowMapper)).isEqualTo(defaultRowMapper);
}
@@ -107,7 +113,7 @@ public class StringBasedJdbcQueryUnitTests {
doReturn("some sql statement").when(queryMethod).getDeclaredQuery();
doReturn(CustomRowMapper.class).when(queryMethod).getRowMapperClass();
StringBasedJdbcQuery query = new StringBasedJdbcQuery(queryMethod, operations, defaultRowMapper, converter, beanFactory);
StringBasedJdbcQuery query = createQuery();
assertThat(query.determineRowMapper(defaultRowMapper)).isInstanceOf(CustomRowMapper.class);
}
@@ -118,9 +124,9 @@ public class StringBasedJdbcQueryUnitTests {
doReturn("some sql statement").when(queryMethod).getDeclaredQuery();
doReturn(CustomResultSetExtractor.class).when(queryMethod).getResultSetExtractorClass();
new StringBasedJdbcQuery(queryMethod, operations, defaultRowMapper, converter, beanFactory).execute(new Object[] {});
createQuery().execute(new Object[] {});
StringBasedJdbcQuery query = new StringBasedJdbcQuery(queryMethod, operations, defaultRowMapper, converter, beanFactory);
StringBasedJdbcQuery query = createQuery();
ResultSetExtractor<Object> resultSetExtractor = query.determineResultSetExtractor(defaultRowMapper);
@@ -137,7 +143,7 @@ public class StringBasedJdbcQueryUnitTests {
doReturn(CustomResultSetExtractor.class).when(queryMethod).getResultSetExtractorClass();
doReturn(CustomRowMapper.class).when(queryMethod).getRowMapperClass();
StringBasedJdbcQuery query = new StringBasedJdbcQuery(queryMethod, operations, defaultRowMapper, converter, beanFactory);
StringBasedJdbcQuery query = createQuery();
ResultSetExtractor<Object> resultSetExtractor = query
.determineResultSetExtractor(query.determineRowMapper(defaultRowMapper));

View File

@@ -52,6 +52,7 @@ import org.springframework.util.ReflectionUtils;
* @author Maciej Walkowiak
* @author Evgeni Dimitrov
* @author Mark Paluch
* @author Hebert Coelho
*/
public class JdbcQueryLookupStrategyUnitTests {
@@ -62,7 +63,6 @@ public class JdbcQueryLookupStrategyUnitTests {
ProjectionFactory projectionFactory = mock(ProjectionFactory.class);
RepositoryMetadata metadata;
NamedQueries namedQueries = mock(NamedQueries.class);
BeanFactory beanFactory = mock(BeanFactory.class);
NamedParameterJdbcOperations operations = mock(NamedParameterJdbcOperations.class);
@Before
@@ -92,7 +92,7 @@ public class JdbcQueryLookupStrategyUnitTests {
private RepositoryQuery getRepositoryQuery(String name, QueryMappingConfiguration mappingConfiguration) {
JdbcQueryLookupStrategy queryLookupStrategy = new JdbcQueryLookupStrategy(publisher, callbacks, mappingContext,
converter, H2Dialect.INSTANCE, mappingConfiguration, operations, beanFactory);
converter, H2Dialect.INSTANCE, mappingConfiguration, operations, null);
Method method = ReflectionUtils.findMethod(MyRepository.class, name);
return queryLookupStrategy.resolveQuery(method, metadata, projectionFactory, namedQueries);

View File

@@ -1,75 +0,0 @@
package org.springframework.data.jdbc.testing;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.DataAccessException;
import org.springframework.data.annotation.Id;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
@Configuration
public class SingleBaseMappingTestConfiguration {
public final static String VALUE_PROCESSED_BY_SERVICE = "Value Processed by Service";
@Bean(value = "CarResultSetExtractorBean")
public CarResultSetExtractorBean resultSetExtractorBean() {
return new CarResultSetExtractorBean();
}
@Bean
public CustomerService service() {
return new CustomerService();
}
@Bean(value = "CustomRowMapperBean")
public CustomRowMapperBean rowMapperBean() {
return new CustomRowMapperBean();
}
public static class CarResultSetExtractorBean implements ResultSetExtractor<List<Car>> {
@Autowired
private CustomerService customerService;
@Override
public List<Car> extractData(ResultSet rs) throws SQLException, DataAccessException {
return Arrays.asList(new Car(1L, customerService.process()));
}
}
public static class CustomRowMapperBean implements RowMapper<String> {
@Autowired
private CustomerService customerService;
public String mapRow(ResultSet rs, int rowNum) throws SQLException {
return customerService.process();
}
}
public static class CustomerService {
public String process() {
return VALUE_PROCESSED_BY_SERVICE;
}
}
@Data
@AllArgsConstructor
public static class Car {
@Id
private Long id;
private String model;
}
}

View File

@@ -15,24 +15,19 @@
*/
package org.springframework.data.jdbc.testing;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import javax.sql.DataSource;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.*;
import org.springframework.dao.DataAccessException;
import org.springframework.data.annotation.Id;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.convert.CustomConversions;
import org.springframework.data.jdbc.core.convert.BasicJdbcConverter;
import org.springframework.data.jdbc.core.convert.DataAccessStrategy;
@@ -49,8 +44,6 @@ import org.springframework.data.relational.core.dialect.Dialect;
import org.springframework.data.relational.core.mapping.NamingStrategy;
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
import org.springframework.data.repository.core.NamedQueries;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
@@ -80,7 +73,7 @@ public class TestConfiguration {
Dialect dialect, JdbcConverter converter, Optional<NamedQueries> namedQueries) {
JdbcRepositoryFactory factory = new JdbcRepositoryFactory(dataAccessStrategy, context, converter, dialect,
publisher, namedParameterJdbcTemplate(), beanFactory);
publisher, namedParameterJdbcTemplate());
namedQueries.ifPresent(factory::setNamedQueries);
return factory;
}