DATAREST-774 - Separated integration tests from core project to avoid classpath overlap.
Extracted store specific tests into separate test modules to prevent classpath overlap between projects. Those tests are now executed in an "it" build profile to prevent the tests being packaged for distribution on release. Use Map-based repositories and mapping contexts for test in the Core and WebMvc module. Slightly changed the configuration API for lookup types on RepositoryRestConfiguration. Related ticket: DATAREST-776.
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright 2014-2016 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.data.rest.webmvc.solr;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.solr.core.mapping.Indexed;
|
||||
import org.springframework.data.solr.core.mapping.SolrDocument;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
|
||||
/**
|
||||
* @author Christoph Strobl
|
||||
*/
|
||||
@SolrDocument(solrCoreName = "collection1")
|
||||
public class Product {
|
||||
|
||||
private @Id String id;
|
||||
private @Indexed String name;
|
||||
private @Indexed(name = "cat") List<String> categories;
|
||||
|
||||
public Product() {}
|
||||
|
||||
public Product(String id, String name, String... categories) {
|
||||
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.categories = ObjectUtils.isEmpty(categories) ? Collections.<String> emptyList() : Arrays.asList(categories);
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public List<String> getCategories() {
|
||||
return categories;
|
||||
}
|
||||
|
||||
public void setCategories(List<String> categories) {
|
||||
this.categories = categories;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright 2014-2016 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.data.rest.webmvc.solr;
|
||||
|
||||
import org.springframework.data.repository.PagingAndSortingRepository;
|
||||
|
||||
/**
|
||||
* @author Christoph Strobl
|
||||
*/
|
||||
public interface ProductRepository extends PagingAndSortingRepository<Product, String> {}
|
||||
@@ -0,0 +1,171 @@
|
||||
/*
|
||||
* Copyright 2014-2016 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.data.rest.webmvc.solr;
|
||||
|
||||
import static org.springframework.data.rest.webmvc.solr.TestUtils.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
|
||||
import org.apache.solr.core.CloseHook;
|
||||
import org.apache.solr.core.CoreDescriptor;
|
||||
import org.apache.solr.core.SolrCore;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.rules.TemporaryFolder;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.data.solr.core.SolrTemplate;
|
||||
import org.springframework.data.solr.server.SolrClientFactory;
|
||||
import org.springframework.data.solr.server.support.EmbeddedSolrServerFactory;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
import org.springframework.util.FileCopyUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
/**
|
||||
* @author Christoph Strobl
|
||||
* @author Oliver Gierke
|
||||
*/
|
||||
@Configuration
|
||||
public class SolrInfrastructureConfig {
|
||||
|
||||
private static final String CORE_PROPERTIES = "name=collection1";
|
||||
private static final Resource SOLR_CONFIG = new ClassPathResource("solrconfig.xml", SolrInfrastructureConfig.class);
|
||||
private static final Resource SOLR_SCHEMA = new ClassPathResource("schema.xml", SolrInfrastructureConfig.class);
|
||||
private static final Resource SOLR_XML = new ClassPathResource("solr.xml", SolrInfrastructureConfig.class);
|
||||
|
||||
@Bean
|
||||
public SolrClientFactory solrClientFactory(final String solrHomeDir)
|
||||
throws ParserConfigurationException, IOException, SAXException {
|
||||
|
||||
prepareConfiguration(solrHomeDir);
|
||||
return new EmbeddedSolrServerFactory(solrHomeDir);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public SolrTemplate solrTemplate(SolrClientFactory factory) {
|
||||
|
||||
attachCloseHook(factory);
|
||||
return new SolrTemplate(factory);
|
||||
}
|
||||
|
||||
private static void prepareConfiguration(final String solrHomePath) throws IOException {
|
||||
|
||||
Map<String, String> configParams = new HashMap<String, String>();
|
||||
configParams.put("${data.dir}", solrHomePath);
|
||||
configParams.put("${lucene.version}", "5.3.1");
|
||||
|
||||
Resource solrConfig = filterResource(SOLR_CONFIG, configParams);
|
||||
Resource solrSchema = SOLR_SCHEMA;
|
||||
Resource solrXml = SOLR_XML;
|
||||
|
||||
File solrHomeDir = new File(solrHomePath);
|
||||
File collectionDir = new File(solrHomeDir, "collection1");
|
||||
File confDir = new File(collectionDir, "conf");
|
||||
confDir.mkdirs();
|
||||
|
||||
FileCopyUtils.copy(solrXml.getInputStream(), new FileOutputStream(createFile(solrHomeDir, "solr.xml")));
|
||||
FileCopyUtils.copy(CORE_PROPERTIES.getBytes(), new FileOutputStream(createFile(collectionDir, "core.properties")));
|
||||
FileCopyUtils.copy(solrSchema.getInputStream(), new FileOutputStream(createFile(confDir, "schema.xml")));
|
||||
FileCopyUtils.copy(solrConfig.getInputStream(), new FileOutputStream(createFile(confDir, "solrconfig.xml")));
|
||||
}
|
||||
|
||||
private static File createFile(File parent, String child) throws IOException {
|
||||
|
||||
File file = new File(parent, child);
|
||||
if (!file.exists()) {
|
||||
file.createNewFile();
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link SpringJUnit4ClassRunner} executes {@link ClassRule}s before the actual shutdown of the
|
||||
* {@link ApplicationContext}. This causes the {@link TemporaryFolder} to vanish before Solr can gracefully shutdown.
|
||||
* <br />
|
||||
* To prevent error messages popping up we register a {@link CloseHook} re adding the index directory and removing it
|
||||
* after {@link SolrCore#close()}.
|
||||
*
|
||||
* @param factory
|
||||
*/
|
||||
private void attachCloseHook(SolrClientFactory factory) {
|
||||
|
||||
EmbeddedSolrServer server = (EmbeddedSolrServer) factory.getSolrClient();
|
||||
|
||||
for (SolrCore core : server.getCoreContainer().getCores()) {
|
||||
|
||||
core.addCloseHook(new CloseHook() {
|
||||
|
||||
private String path;
|
||||
|
||||
@Override
|
||||
public void preClose(SolrCore core) {
|
||||
|
||||
CoreDescriptor cd = core.getCoreDescriptor();
|
||||
|
||||
if (cd == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
File tmp = new File(core.getIndexDir()).getParentFile();
|
||||
|
||||
if (tmp.exists()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
File indexFile = new File(tmp, "index");
|
||||
indexFile.mkdirs();
|
||||
|
||||
this.path = indexFile.getPath();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postClose(SolrCore core) {
|
||||
|
||||
if (!StringUtils.hasText(this.path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
File tmp = new File(this.path);
|
||||
|
||||
if (tmp.exists() && tmp.getPath().startsWith(FileUtils.getTempDirectoryPath())) {
|
||||
|
||||
try {
|
||||
FileUtils.deleteDirectory(tmp);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright 2014-2016 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.data.rest.webmvc.solr;
|
||||
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.rules.TemporaryFolder;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.data.solr.repository.config.EnableSolrRepositories;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
|
||||
/**
|
||||
* @author Christoph Strobl
|
||||
*/
|
||||
@ContextConfiguration
|
||||
public class SolrTestBase {
|
||||
|
||||
public static @ClassRule TemporaryFolder TEMP_FOLDER = new TemporaryFolder();
|
||||
|
||||
@Configuration
|
||||
@EnableSolrRepositories
|
||||
@Import(SolrInfrastructureConfig.class)
|
||||
static class MyConf {
|
||||
|
||||
@Bean
|
||||
String solrHomeDir() {
|
||||
return TEMP_FOLDER.getRoot().getAbsolutePath();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
/*
|
||||
* Copyright 2014-2016 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.data.rest.webmvc.solr;
|
||||
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.TemporaryFolder;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.data.rest.tests.CommonWebTests;
|
||||
import org.springframework.data.solr.repository.config.EnableSolrRepositories;
|
||||
import org.springframework.hateoas.Link;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.mock.web.MockHttpServletResponse;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
/**
|
||||
* @author Christoph Strobl
|
||||
*/
|
||||
@ContextConfiguration(classes = { SolrWebTests.MyConf.class })
|
||||
public class SolrWebTests extends CommonWebTests {
|
||||
|
||||
public static @ClassRule TemporaryFolder TEMP_FOLDER = new TemporaryFolder();
|
||||
|
||||
private static final Product PLAYSTATION = new Product("1", "playstation", "electronic", "game", "media");
|
||||
private static final Product GAMEBOY = new Product("2", "gameboy", "electronic");
|
||||
private static final Product AMIGA500 = new Product("3", "amiga500", "ancient");
|
||||
|
||||
private static final ObjectMapper MAPPER = new ObjectMapper();
|
||||
|
||||
@Configuration
|
||||
@EnableSolrRepositories
|
||||
@Import(value = { SolrInfrastructureConfig.class })
|
||||
static class MyConf {
|
||||
|
||||
@Bean
|
||||
String solrHomeDir() {
|
||||
return TEMP_FOLDER.getRoot().getAbsolutePath();
|
||||
}
|
||||
}
|
||||
|
||||
@Autowired ProductRepository repo;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
|
||||
super.setUp();
|
||||
repo.save(Arrays.asList(PLAYSTATION, GAMEBOY, AMIGA500));
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
repo.deleteAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAREST-387
|
||||
*/
|
||||
@Test
|
||||
public void allowsPaginationThroughData() throws Exception {
|
||||
|
||||
MockHttpServletResponse response = client.request("/products?page=0&size=1");
|
||||
|
||||
Link nextLink = client.assertHasLinkWithRel(Link.REL_NEXT, response);
|
||||
assertDoesNotHaveLinkWithRel(Link.REL_PREVIOUS, response);
|
||||
|
||||
response = client.request(nextLink);
|
||||
client.assertHasLinkWithRel(Link.REL_PREVIOUS, response);
|
||||
nextLink = client.assertHasLinkWithRel(Link.REL_NEXT, response);
|
||||
|
||||
response = client.request(nextLink);
|
||||
client.assertHasLinkWithRel(Link.REL_PREVIOUS, response);
|
||||
assertDoesNotHaveLinkWithRel(Link.REL_NEXT, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAREST-387
|
||||
*/
|
||||
@Test
|
||||
public void allowsRetrievingDataById() throws Exception {
|
||||
requestAndCompare(PLAYSTATION);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAREST-387
|
||||
*/
|
||||
@Test
|
||||
public void createsEntitesCorrectly() throws Exception {
|
||||
|
||||
Product product = new Product("4", "iWatch", "trends", "scary");
|
||||
|
||||
mvc.perform(
|
||||
put("/products/{id}", 4).content(MAPPER.writeValueAsString(product)).contentType(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isCreated()).andReturn().getResponse();
|
||||
|
||||
assertJsonDocumentMatches(product);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAREST-387
|
||||
*/
|
||||
@Test
|
||||
public void deletesEntitiesCorrectly() throws Exception {
|
||||
deleteAndVerify(new Link("/products/1"));
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.springframework.data.rest.webmvc.AbstractWebIntegrationTests#expectedRootLinkRels()
|
||||
*/
|
||||
@Override
|
||||
protected Iterable<String> expectedRootLinkRels() {
|
||||
return Arrays.asList("products");
|
||||
}
|
||||
|
||||
private void assertJsonDocumentMatches(Product reference) throws Exception {
|
||||
requestAndCompare(reference);
|
||||
}
|
||||
|
||||
private MockHttpServletResponse requestAndCompare(Product reference) throws Exception {
|
||||
|
||||
MockHttpServletResponse response = client.request("/products/" + reference.getId());
|
||||
|
||||
assertJsonPathEquals("name", reference.getName(), response);
|
||||
assertJsonPathEquals("categories", MAPPER.writeValueAsString(reference.getCategories()), response);
|
||||
|
||||
return response;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright 2014-2016 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.data.rest.webmvc.solr;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.core.io.ByteArrayResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StreamUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* Test helper methods.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
* @author Christoph Strobl
|
||||
*/
|
||||
class TestUtils {
|
||||
|
||||
private static final Charset UTF8 = Charset.forName("UTF-8");
|
||||
|
||||
/**
|
||||
* Filters the given {@link Resource} by replacing values within.
|
||||
*
|
||||
* @param source must not be {@literal null}.
|
||||
* @param replacements
|
||||
* @return {@link Resource} with replaced values.
|
||||
* @throws IOException
|
||||
*/
|
||||
public static Resource filterResource(Resource source, Map<String, ?> replacements) throws IOException {
|
||||
|
||||
Assert.notNull(source, "Cannot filter 'null' resource");
|
||||
if (CollectionUtils.isEmpty(replacements)) {
|
||||
return source;
|
||||
}
|
||||
|
||||
String temp = StreamUtils.copyToString(source.getInputStream(), UTF8);
|
||||
|
||||
for (Map.Entry<String, ?> entry : replacements.entrySet()) {
|
||||
temp = StringUtils.replace(temp, entry.getKey(), entry.getValue() != null ? entry.getValue().toString() : "");
|
||||
}
|
||||
|
||||
return new ByteArrayResource(temp.getBytes(UTF8));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<schema name="minimal" version="1.1">
|
||||
<types>
|
||||
<fieldType name="string" class="solr.StrField" />
|
||||
</types>
|
||||
<fields>
|
||||
<field name="id" type="string" indexed="true" stored="true"
|
||||
required="true" />
|
||||
<field name="name" type="string" indexed="true" stored="true" />
|
||||
<field name="cat" type="string" indexed="true" stored="true" multiValued="true" />
|
||||
</fields>
|
||||
<uniqueKey>id</uniqueKey>
|
||||
</schema>
|
||||
@@ -0,0 +1,16 @@
|
||||
<solr>
|
||||
|
||||
<solrcloud>
|
||||
<str name="host">${host:}</str>
|
||||
<int name="hostPort">${jetty.port:8983}</int>
|
||||
<str name="hostContext">${hostContext:solr}</str>
|
||||
<int name="zkClientTimeout">${zkClientTimeout:15000}</int>
|
||||
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
|
||||
</solrcloud>
|
||||
|
||||
<shardHandlerFactory name="shardHandlerFactory" class="HttpShardHandlerFactory">
|
||||
<int name="socketTimeout">${socketTimeout:0}</int>
|
||||
<int name="connTimeout">${connTimeout:0}</int>
|
||||
</shardHandlerFactory>
|
||||
|
||||
</solr>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<config>
|
||||
<dataDir>${data.dir}</dataDir>
|
||||
<directoryFactory name="DirectoryFactory"
|
||||
class="solr.NRTCachingDirectoryFactory" />
|
||||
<luceneMatchVersion>${lucene.version}</luceneMatchVersion>
|
||||
<updateHandler class="solr.DirectUpdateHandler2">
|
||||
<commitWithin>
|
||||
<softCommit>${solr.commitwithin.softcommit:true}</softCommit>
|
||||
</commitWithin>
|
||||
</updateHandler>
|
||||
<requestHandler name="/select" class="solr.SearchHandler">
|
||||
<lst name="defaults">
|
||||
<str name="echoParams">explicit</str>
|
||||
<str name="indent">true</str>
|
||||
<str name="df">text</str>
|
||||
</lst>
|
||||
</requestHandler>
|
||||
<requestHandler name="/admin/"
|
||||
class="org.apache.solr.handler.admin.AdminHandlers" />
|
||||
<requestHandler name="/update" class="solr.UpdateRequestHandler" />
|
||||
</config>
|
||||
Reference in New Issue
Block a user