Polish Spring Data Solr integration

This commit is contained in:
Andy Wilkinson 2014-05-22 08:45:41 +01:00
parent 6ed69709d7
commit e45ef06b56
13 changed files with 72 additions and 91 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2012-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -36,13 +36,14 @@ import org.springframework.data.solr.repository.support.SolrRepositoryFactoryBea
* If active auto configuration does the same as
* {@link org.springframework.data.solr.repository.config.EnableSolrRepositories} would
* do.
*
*
* @author Christoph Strobl
* @since 1.1.0
*/
@Configuration
@ConditionalOnClass({ SolrServer.class, SolrRepository.class })
@ConditionalOnMissingBean(SolrRepositoryFactoryBean.class)
@Import(SolrRepositoriesAutoConfigureRegstrar.class)
@Import(SolrRepositoriesAutoConfigureRegistrar.class)
public class SolrRepositoriesAutoConfiguration {
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2012-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -26,40 +26,23 @@ import org.springframework.data.solr.repository.config.SolrRepositoryConfigExten
/**
* {@link ImportBeanDefinitionRegistrar} used to auto-configure Spring Data Solr
* repositories.
*
*
* @author Christoph Strobl
* @since 1.1.0
*/
public class SolrRepositoriesAutoConfigureRegstrar extends
public class SolrRepositoriesAutoConfigureRegistrar extends
AbstractRepositoryConfigurationSourceSupport {
/*
* (non-Javadoc)
*
* @see org.springframework.boot.autoconfigure.data.
* AbstractRepositoryConfigurationSourceSupport#getAnnotation()
*/
@Override
protected Class<? extends Annotation> getAnnotation() {
return EnableSolrRepositories.class;
}
/*
* (non-Javadoc)
*
* @see org.springframework.boot.autoconfigure.data.
* AbstractRepositoryConfigurationSourceSupport#getConfiguration()
*/
@Override
protected Class<?> getConfiguration() {
return EnableSolrRepositoriesConfiguration.class;
}
/*
* (non-Javadoc)
*
* @see org.springframework.boot.autoconfigure.data.
* AbstractRepositoryConfigurationSourceSupport#getRepositoryConfigurationExtension()
*/
@Override
protected RepositoryConfigurationExtension getRepositoryConfigurationExtension() {
return new SolrRepositoryConfigExtension();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2012-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -22,6 +22,7 @@ import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@ -30,16 +31,18 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
/**
* Enables auto configuration for Solr.
*
* {@link EnableAutoConfiguration Auto-configuration} for Solr
*
* @author Christoph Strobl
* @since 1.1.0
*/
@Configuration
@ConditionalOnClass(SolrServer.class)
@EnableConfigurationProperties(SolrProperties.class)
public class SolrAutoConfiguration {
private @Autowired SolrProperties properties;
@Autowired
private SolrProperties properties;
private SolrServer solrServer;
@ -53,13 +56,11 @@ public class SolrAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public SolrServer solrServer() {
this.solrServer = createSolrServer();
return this.solrServer;
}
private SolrServer createSolrServer() {
if (StringUtils.hasText(this.properties.getZkHost())) {
return new CloudSolrServer(this.properties.getZkHost());
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2012-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -20,8 +20,9 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* Configuration properties for Solr.
*
*
* @author Christoph Strobl
* @since 1.1.0
*/
@ConfigurationProperties(prefix = "spring.data.solr")
public class SolrProperties {
@ -31,7 +32,7 @@ public class SolrProperties {
private String zkHost;
public String getHost() {
return host;
return this.host;
}
public void setHost(String host) {
@ -39,7 +40,7 @@ public class SolrProperties {
}
public String getZkHost() {
return zkHost;
return this.zkHost;
}
public void setZkHost(String zkHost) {

View File

@ -38,7 +38,7 @@ import static org.junit.Assert.assertNotNull;
/**
* Tests for {@link JpaRepositoriesAutoConfiguration}.
*
*
* @author Dave Syer
* @author Oliver Gierke
*/
@ -83,9 +83,9 @@ public class JpaRepositoriesAutoConfigurationTests {
@Configuration
@EnableJpaRepositories(basePackageClasses = org.springframework.boot.autoconfigure.data.alt.CityJpaRepository.class, excludeFilters = {
@Filter(type = FilterType.ASSIGNABLE_TYPE, value = CityMongoDbRepository.class),
@Filter(type = FilterType.ASSIGNABLE_TYPE, value = CitySolrRepository.class) })
@TestAutoConfigurationPackage(City.class)
@Filter(type = FilterType.ASSIGNABLE_TYPE, value = CityMongoDbRepository.class),
@Filter(type = FilterType.ASSIGNABLE_TYPE, value = CitySolrRepository.class) })
@TestAutoConfigurationPackage(City.class)
protected static class CustomConfiguration {
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2012-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -15,10 +15,6 @@
*/
package org.springframework.boot.autoconfigure.data;
import static org.hamcrest.core.IsInstanceOf.*;
import static org.hamcrest.core.IsNull.*;
import static org.junit.Assert.*;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.junit.Test;
@ -32,7 +28,13 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext
import org.springframework.context.annotation.Configuration;
import org.springframework.data.solr.repository.config.EnableSolrRepositories;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertThat;
/**
* Tests for {@link SolrRepositoriesAutoConfiguration}
*
* @author Christoph Strobl
*/
public class SolrRepositoriesAutoConfigurationTests {
@ -41,23 +43,22 @@ public class SolrRepositoriesAutoConfigurationTests {
@Test
public void testDefaultRepositoryConfiguration() {
initContext(TestConfiguration.class);
assertThat(this.context.getBean(CityRepository.class), notNullValue());
assertThat(this.context.getBean(SolrServer.class), instanceOf(HttpSolrServer.class));
assertThat(this.context.getBean(SolrServer.class),
instanceOf(HttpSolrServer.class));
}
@Test
public void testNoRepositoryConfiguration() {
initContext(EmptyConfiguration.class);
assertThat(this.context.getBean(SolrServer.class), instanceOf(HttpSolrServer.class));
assertThat(this.context.getBean(SolrServer.class),
instanceOf(HttpSolrServer.class));
}
@Test
public void doesNotTriggerDefaultRepositoryDetectionIfCustomized() {
initContext(CustomizedConfiguration.class);
assertThat(this.context.getBean(CitySolrRepository.class), notNullValue());
}
@ -65,7 +66,8 @@ public class SolrRepositoriesAutoConfigurationTests {
private void initContext(Class<?> configClass) {
this.context = new AnnotationConfigApplicationContext();
this.context.register(configClass, SolrAutoConfiguration.class, SolrRepositoriesAutoConfiguration.class,
this.context.register(configClass, SolrAutoConfiguration.class,
SolrRepositoriesAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class);
this.context.refresh();
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2012-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.data.solr;
import org.springframework.data.annotation.Id;
@ -29,7 +30,7 @@ public class City {
private @Indexed String name;
public String getId() {
return id;
return this.id;
}
public void setId(String id) {
@ -37,7 +38,7 @@ public class City {
}
public String getName() {
return name;
return this.name;
}
public void setName(String name) {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2012-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.data.solr;
import org.springframework.data.domain.Page;

View File

@ -192,6 +192,11 @@
<artifactId>spring-boot-starter-data-rest</artifactId>
<version>1.1.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
<version>1.1.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>

View File

@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2012-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -23,9 +23,6 @@ import org.springframework.data.annotation.Id;
import org.springframework.data.solr.core.geo.Point;
import org.springframework.data.solr.core.mapping.SolrDocument;
/**
* @author Christoph Strobl
*/
@SolrDocument(solrCoreName = "collection1")
public class Product {
@ -55,7 +52,7 @@ public class Product {
}
public String getId() {
return id;
return this.id;
}
public void setId(String id) {
@ -63,7 +60,7 @@ public class Product {
}
public String getName() {
return name;
return this.name;
}
public void setName(String name) {
@ -71,7 +68,7 @@ public class Product {
}
public Double getPrice() {
return price;
return this.price;
}
public void setPrice(Double price) {
@ -79,7 +76,7 @@ public class Product {
}
public List<String> getCategory() {
return category;
return this.category;
}
public void setCategory(List<String> category) {
@ -87,7 +84,7 @@ public class Product {
}
public Point getLocation() {
return location;
return this.location;
}
public void setLocation(Point location) {
@ -96,8 +93,8 @@ public class Product {
@Override
public String toString() {
return "Product [id=" + id + ", name=" + name + ", price=" + price
+ ", category=" + category + ", location=" + location + "]";
return "Product [id=" + this.id + ", name=" + this.name + ", price=" + this.price
+ ", category=" + this.category + ", location=" + this.location + "]";
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2012-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -20,9 +20,6 @@ import java.util.List;
import org.springframework.data.solr.repository.SolrCrudRepository;
/**
* @author Christoph Strobl
*/
public interface ProductRepository extends SolrCrudRepository<Product, String> {
List<Product> findByNameStartingWith(String name);

View File

@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2012-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -23,9 +23,6 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @author Christoph Strobl
*/
@Configuration
@EnableAutoConfiguration
@ComponentScan
@ -37,17 +34,17 @@ public class SampleSolrApplication implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
repository.deleteAll();
this.repository.deleteAll();
// insert some products
repository.save(new Product("1", "Nintendo Entertainment System"));
repository.save(new Product("2", "Sega Megadrive"));
repository.save(new Product("3", "Sony Playstation"));
this.repository.save(new Product("1", "Nintendo Entertainment System"));
this.repository.save(new Product("2", "Sega Megadrive"));
this.repository.save(new Product("3", "Sony Playstation"));
// fetch all
System.out.println("Products found by findAll():");
System.out.println("----------------------------");
for (Product product : repository.findAll()) {
for (Product product : this.repository.findAll()) {
System.out.println(product);
}
System.out.println();
@ -55,7 +52,7 @@ public class SampleSolrApplication implements CommandLineRunner {
// fetch a single product
System.out.println("Products founds with findByNameStartingWith('So'):");
System.out.println("--------------------------------");
for (Product product : repository.findByNameStartingWith("So")) {
for (Product product : this.repository.findByNameStartingWith("So")) {
System.out.println(product);
}
System.out.println();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2012-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -16,17 +16,13 @@
package sample.data.solr;
import static org.junit.Assert.*;
import org.apache.solr.client.solrj.SolrServerException;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.boot.test.OutputCapture;
import org.springframework.core.NestedCheckedException;
/**
* @author Christoph Strobl
*/
import static org.junit.Assert.assertTrue;
public class SampleSolrApplicationTests {
@Rule
@ -37,7 +33,8 @@ public class SampleSolrApplicationTests {
try {
SampleSolrApplication.main(new String[0]);
} catch (IllegalStateException ex) {
}
catch (IllegalStateException ex) {
if (serverNotRunning(ex)) {
return;
}
@ -51,11 +48,9 @@ public class SampleSolrApplicationTests {
@SuppressWarnings("serial")
NestedCheckedException nested = new NestedCheckedException("failed", ex) {
};
if (nested.contains(SolrServerException.class)) {
Throwable root = nested.getRootCause();
if (root.getMessage().contains("Connection refused")) {
return true;
}
Throwable root = nested.getRootCause();
if (root.getMessage().contains("Connection refused")) {
return true;
}
return false;
}