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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -38,11 +38,12 @@ import org.springframework.data.solr.repository.support.SolrRepositoryFactoryBea
* do. * do.
* *
* @author Christoph Strobl * @author Christoph Strobl
* @since 1.1.0
*/ */
@Configuration @Configuration
@ConditionalOnClass({ SolrServer.class, SolrRepository.class }) @ConditionalOnClass({ SolrServer.class, SolrRepository.class })
@ConditionalOnMissingBean(SolrRepositoryFactoryBean.class) @ConditionalOnMissingBean(SolrRepositoryFactoryBean.class)
@Import(SolrRepositoriesAutoConfigureRegstrar.class) @Import(SolrRepositoriesAutoConfigureRegistrar.class)
public class SolrRepositoriesAutoConfiguration { 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -28,38 +28,21 @@ import org.springframework.data.solr.repository.config.SolrRepositoryConfigExten
* repositories. * repositories.
* *
* @author Christoph Strobl * @author Christoph Strobl
* @since 1.1.0
*/ */
public class SolrRepositoriesAutoConfigureRegstrar extends public class SolrRepositoriesAutoConfigureRegistrar extends
AbstractRepositoryConfigurationSourceSupport { AbstractRepositoryConfigurationSourceSupport {
/*
* (non-Javadoc)
*
* @see org.springframework.boot.autoconfigure.data.
* AbstractRepositoryConfigurationSourceSupport#getAnnotation()
*/
@Override @Override
protected Class<? extends Annotation> getAnnotation() { protected Class<? extends Annotation> getAnnotation() {
return EnableSolrRepositories.class; return EnableSolrRepositories.class;
} }
/*
* (non-Javadoc)
*
* @see org.springframework.boot.autoconfigure.data.
* AbstractRepositoryConfigurationSourceSupport#getConfiguration()
*/
@Override @Override
protected Class<?> getConfiguration() { protected Class<?> getConfiguration() {
return EnableSolrRepositoriesConfiguration.class; return EnableSolrRepositoriesConfiguration.class;
} }
/*
* (non-Javadoc)
*
* @see org.springframework.boot.autoconfigure.data.
* AbstractRepositoryConfigurationSourceSupport#getRepositoryConfigurationExtension()
*/
@Override @Override
protected RepositoryConfigurationExtension getRepositoryConfigurationExtension() { protected RepositoryConfigurationExtension getRepositoryConfigurationExtension() {
return new SolrRepositoryConfigExtension(); 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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.CloudSolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.springframework.beans.factory.annotation.Autowired; 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.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
@ -30,16 +31,18 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
/** /**
* Enables auto configuration for Solr. * {@link EnableAutoConfiguration Auto-configuration} for Solr
* *
* @author Christoph Strobl * @author Christoph Strobl
* @since 1.1.0
*/ */
@Configuration @Configuration
@ConditionalOnClass(SolrServer.class) @ConditionalOnClass(SolrServer.class)
@EnableConfigurationProperties(SolrProperties.class) @EnableConfigurationProperties(SolrProperties.class)
public class SolrAutoConfiguration { public class SolrAutoConfiguration {
private @Autowired SolrProperties properties; @Autowired
private SolrProperties properties;
private SolrServer solrServer; private SolrServer solrServer;
@ -53,13 +56,11 @@ public class SolrAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public SolrServer solrServer() { public SolrServer solrServer() {
this.solrServer = createSolrServer(); this.solrServer = createSolrServer();
return this.solrServer; return this.solrServer;
} }
private SolrServer createSolrServer() { private SolrServer createSolrServer() {
if (StringUtils.hasText(this.properties.getZkHost())) { if (StringUtils.hasText(this.properties.getZkHost())) {
return new CloudSolrServer(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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -22,6 +22,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* Configuration properties for Solr. * Configuration properties for Solr.
* *
* @author Christoph Strobl * @author Christoph Strobl
* @since 1.1.0
*/ */
@ConfigurationProperties(prefix = "spring.data.solr") @ConfigurationProperties(prefix = "spring.data.solr")
public class SolrProperties { public class SolrProperties {
@ -31,7 +32,7 @@ public class SolrProperties {
private String zkHost; private String zkHost;
public String getHost() { public String getHost() {
return host; return this.host;
} }
public void setHost(String host) { public void setHost(String host) {
@ -39,7 +40,7 @@ public class SolrProperties {
} }
public String getZkHost() { public String getZkHost() {
return zkHost; return this.zkHost;
} }
public void setZkHost(String zkHost) { public void setZkHost(String zkHost) {

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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -15,10 +15,6 @@
*/ */
package org.springframework.boot.autoconfigure.data; 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.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.junit.Test; import org.junit.Test;
@ -32,7 +28,13 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.solr.repository.config.EnableSolrRepositories; 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 * @author Christoph Strobl
*/ */
public class SolrRepositoriesAutoConfigurationTests { public class SolrRepositoriesAutoConfigurationTests {
@ -41,23 +43,22 @@ public class SolrRepositoriesAutoConfigurationTests {
@Test @Test
public void testDefaultRepositoryConfiguration() { public void testDefaultRepositoryConfiguration() {
initContext(TestConfiguration.class); initContext(TestConfiguration.class);
assertThat(this.context.getBean(CityRepository.class), notNullValue()); 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 @Test
public void testNoRepositoryConfiguration() { public void testNoRepositoryConfiguration() {
initContext(EmptyConfiguration.class); initContext(EmptyConfiguration.class);
assertThat(this.context.getBean(SolrServer.class), instanceOf(HttpSolrServer.class)); assertThat(this.context.getBean(SolrServer.class),
instanceOf(HttpSolrServer.class));
} }
@Test @Test
public void doesNotTriggerDefaultRepositoryDetectionIfCustomized() { public void doesNotTriggerDefaultRepositoryDetectionIfCustomized() {
initContext(CustomizedConfiguration.class); initContext(CustomizedConfiguration.class);
assertThat(this.context.getBean(CitySolrRepository.class), notNullValue()); assertThat(this.context.getBean(CitySolrRepository.class), notNullValue());
} }
@ -65,7 +66,8 @@ public class SolrRepositoriesAutoConfigurationTests {
private void initContext(Class<?> configClass) { private void initContext(Class<?> configClass) {
this.context = new AnnotationConfigApplicationContext(); this.context = new AnnotationConfigApplicationContext();
this.context.register(configClass, SolrAutoConfiguration.class, SolrRepositoriesAutoConfiguration.class, this.context.register(configClass, SolrAutoConfiguration.class,
SolrRepositoriesAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class); PropertyPlaceholderAutoConfiguration.class);
this.context.refresh(); 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.boot.autoconfigure.data.solr; package org.springframework.boot.autoconfigure.data.solr;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
@ -29,7 +30,7 @@ public class City {
private @Indexed String name; private @Indexed String name;
public String getId() { public String getId() {
return id; return this.id;
} }
public void setId(String id) { public void setId(String id) {
@ -37,7 +38,7 @@ public class City {
} }
public String getName() { public String getName() {
return name; return this.name;
} }
public void setName(String 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.boot.autoconfigure.data.solr; package org.springframework.boot.autoconfigure.data.solr;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;

View File

@ -192,6 +192,11 @@
<artifactId>spring-boot-starter-data-rest</artifactId> <artifactId>spring-boot-starter-data-rest</artifactId>
<version>1.1.0.BUILD-SNAPSHOT</version> <version>1.1.0.BUILD-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
<version>1.1.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId> <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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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.geo.Point;
import org.springframework.data.solr.core.mapping.SolrDocument; import org.springframework.data.solr.core.mapping.SolrDocument;
/**
* @author Christoph Strobl
*/
@SolrDocument(solrCoreName = "collection1") @SolrDocument(solrCoreName = "collection1")
public class Product { public class Product {
@ -55,7 +52,7 @@ public class Product {
} }
public String getId() { public String getId() {
return id; return this.id;
} }
public void setId(String id) { public void setId(String id) {
@ -63,7 +60,7 @@ public class Product {
} }
public String getName() { public String getName() {
return name; return this.name;
} }
public void setName(String name) { public void setName(String name) {
@ -71,7 +68,7 @@ public class Product {
} }
public Double getPrice() { public Double getPrice() {
return price; return this.price;
} }
public void setPrice(Double price) { public void setPrice(Double price) {
@ -79,7 +76,7 @@ public class Product {
} }
public List<String> getCategory() { public List<String> getCategory() {
return category; return this.category;
} }
public void setCategory(List<String> category) { public void setCategory(List<String> category) {
@ -87,7 +84,7 @@ public class Product {
} }
public Point getLocation() { public Point getLocation() {
return location; return this.location;
} }
public void setLocation(Point location) { public void setLocation(Point location) {
@ -96,8 +93,8 @@ public class Product {
@Override @Override
public String toString() { public String toString() {
return "Product [id=" + id + ", name=" + name + ", price=" + price return "Product [id=" + this.id + ", name=" + this.name + ", price=" + this.price
+ ", category=" + category + ", location=" + location + "]"; + ", 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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; import org.springframework.data.solr.repository.SolrCrudRepository;
/**
* @author Christoph Strobl
*/
public interface ProductRepository extends SolrCrudRepository<Product, String> { public interface ProductRepository extends SolrCrudRepository<Product, String> {
List<Product> findByNameStartingWith(String name); 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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.ComponentScan;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
/**
* @author Christoph Strobl
*/
@Configuration @Configuration
@EnableAutoConfiguration @EnableAutoConfiguration
@ComponentScan @ComponentScan
@ -37,17 +34,17 @@ public class SampleSolrApplication implements CommandLineRunner {
@Override @Override
public void run(String... args) throws Exception { public void run(String... args) throws Exception {
repository.deleteAll(); this.repository.deleteAll();
// insert some products // insert some products
repository.save(new Product("1", "Nintendo Entertainment System")); this.repository.save(new Product("1", "Nintendo Entertainment System"));
repository.save(new Product("2", "Sega Megadrive")); this.repository.save(new Product("2", "Sega Megadrive"));
repository.save(new Product("3", "Sony Playstation")); this.repository.save(new Product("3", "Sony Playstation"));
// fetch all // fetch all
System.out.println("Products found by findAll():"); System.out.println("Products found by findAll():");
System.out.println("----------------------------"); System.out.println("----------------------------");
for (Product product : repository.findAll()) { for (Product product : this.repository.findAll()) {
System.out.println(product); System.out.println(product);
} }
System.out.println(); System.out.println();
@ -55,7 +52,7 @@ public class SampleSolrApplication implements CommandLineRunner {
// fetch a single product // fetch a single product
System.out.println("Products founds with findByNameStartingWith('So'):"); System.out.println("Products founds with findByNameStartingWith('So'):");
System.out.println("--------------------------------"); System.out.println("--------------------------------");
for (Product product : repository.findByNameStartingWith("So")) { for (Product product : this.repository.findByNameStartingWith("So")) {
System.out.println(product); System.out.println(product);
} }
System.out.println(); 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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,17 +16,13 @@
package sample.data.solr; package sample.data.solr;
import static org.junit.Assert.*;
import org.apache.solr.client.solrj.SolrServerException;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.test.OutputCapture; import org.springframework.boot.test.OutputCapture;
import org.springframework.core.NestedCheckedException; import org.springframework.core.NestedCheckedException;
/** import static org.junit.Assert.assertTrue;
* @author Christoph Strobl
*/
public class SampleSolrApplicationTests { public class SampleSolrApplicationTests {
@Rule @Rule
@ -37,7 +33,8 @@ public class SampleSolrApplicationTests {
try { try {
SampleSolrApplication.main(new String[0]); SampleSolrApplication.main(new String[0]);
} catch (IllegalStateException ex) { }
catch (IllegalStateException ex) {
if (serverNotRunning(ex)) { if (serverNotRunning(ex)) {
return; return;
} }
@ -51,12 +48,10 @@ public class SampleSolrApplicationTests {
@SuppressWarnings("serial") @SuppressWarnings("serial")
NestedCheckedException nested = new NestedCheckedException("failed", ex) { NestedCheckedException nested = new NestedCheckedException("failed", ex) {
}; };
if (nested.contains(SolrServerException.class)) {
Throwable root = nested.getRootCause(); Throwable root = nested.getRootCause();
if (root.getMessage().contains("Connection refused")) { if (root.getMessage().contains("Connection refused")) {
return true; return true;
} }
}
return false; return false;
} }
} }