2. Connecting to Solr using HttpClientTemplate & HttpClientOxmTemplate

Spring Configuration

An HttpClientTemplate and HttpClientOxmTemplate are configured. The former is used for non-marshalling requests and the latter is for marhsallin requests.

SolrHttpClientTemplateTest-context.xml
                    
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context.xsd">
 
    <!-- Loads CatalogItemMarshaller -->
    <context:component-scan base-package="org.springbyexample.enterprise.solr" />
    
    <context:property-placeholder location="org/springbyexample/enterprise/solr/solr.properties"/>
    
    <bean id="selectUrl" class="java.lang.String">
        <constructor-arg value="http://${solr.host}:${solr.port}/solr/select" />
    </bean>
    <bean id="updateUrl" class="java.lang.String">
        <constructor-arg value="http://${solr.host}:${solr.port}/solr/update" />
    </bean>

    <bean id="selectTemplate" class="org.springbyexample.httpclient.HttpClientTemplate"
          p:defaultUri-ref="selectUrl" />
          
    <bean id="updateTemplate" class="org.springbyexample.httpclient.HttpClientTemplate"
          p:defaultUri-ref="updateUrl" />
                  
    <bean id="marshallingSelectTemplate" class="org.springbyexample.httpclient.HttpClientOxmTemplate"
          p:defaultUri-ref="selectUrl"
          p:marshaller-ref="catalogItemMarshaller" 
          p:unmarshaller-ref="catalogItemMarshaller" />

    <bean id="marshallingUpdateTemplate" parent="marshallingSelectTemplate"
          p:defaultUri-ref="updateUrl" />

</beans>
                    
                

Code Example

A basic search, paginated search, and update will be shown using marshalling and unmarshalling with HttpClientOxmTemplate. Also HttpClientTemplate is used to make search requests and log the results for debugging.

Search

A simple search is made by passing in the search query as the key of 'q'. The selectTemplate is the HttpClientTemplate and performs a search based Map and logs the results. The same Map is then used by the marshallingSelectTemplate to make a request that is unmarshalled into a list of CatalogItems.

Example 8. Excerpt from SolrHttpClientTemplateTest.testSearch()

                        
public void testSearch() {
    assertNotNull("HttpClientOxmTemplate is null.", marshallingSelectTemplate);

    Map<String, String> hParams = new HashMap<String, String>();
    hParams.put("q", SEARCH_QUERY_PARAM);
    hParams.put("indent", "on");

    // just for debugging
    selectTemplate.executeGetMethod(hParams, new ResponseStringCallback() {
        public void doWithResponse(String response) throws IOException {
            logger.debug(response);
        }
    });

    marshallingSelectTemplate.executeGetMethod(hParams,
        new ResponseCallback<List<CatalogItem>>() {
            public void doWithResponse(List<CatalogItem> lCatalogItems) throws IOException {
                assertNotNull("Catalog item list is null.", lCatalogItems);

                int expectedCount = 2;
                assertEquals("Catalog item list should be '" + expectedCount + "'.", expectedCount, lCatalogItems.size());

                CatalogItem item = lCatalogItems.get(0);

                logger.debug("id={}  manufacturer={}  name={} price={} inStock={} popularity={}",
                        new Object[] { item.getId(), item.getManufacturer(), item.getName(),
                                       item.getPrice(), item.isInStock(), item.getPopularity() });

...
            }
    });
}
                        
                    

Paginated Search

This search is paginated since it defines what range of results to return, which are defined by the 'start' key and the 'rows' key. The search parameter is defined by the 'q' key, and searches for any record that has 'electronics' in it. The 'indent' key is useful for having formatted results logged by selectTemplate for debugging.

Example 9. Excerpt from SolrHttpClientTemplateTest.testPaginatedSearch()

                        
public void testPaginatedSearch() {
    assertNotNull("HttpClientOxmTemplate is null.", marshallingSelectTemplate);

    Map<String, String> hParams = new HashMap<String, String>();
    hParams.put("q", "electronics");
    hParams.put("start", "5");
    hParams.put("rows", "5");
    hParams.put("indent", "on");

    // just for debugging
    selectTemplate.executeGetMethod(hParams, new ResponseStringCallback() {
        public void doWithResponse(String response) throws IOException {
            logger.debug(response);
        }
    });

    marshallingSelectTemplate.executeGetMethod(hParams,
        new ResponseCallback<List<CatalogItem>>() {
            public void doWithResponse(List<CatalogItem> lCatalogItems) throws IOException {
                assertNotNull("Catalog item list is null.", lCatalogItems);

                int expectedCount = 5;
                assertEquals("Catalog item list should be '" + expectedCount + "'.", expectedCount, lCatalogItems.size());

                CatalogItem item = lCatalogItems.get(0);

                logger.debug("id={}  manufacturer={}  name={} price={} inStock={} popularity={}",
                        new Object[] { item.getId(), item.getManufacturer(), item.getName(),
                                       item.getPrice(), item.isInStock(), item.getPopularity() });

...
            }
    });
}
                        
                    

Update

Adds or updates a list of JavaBeans and then calls commit. The add or update isn't committed until a commit is sent.

Example 10. Excerpt from SolrHttpClientTemplateTest.testUpdate()

                        
public void testUpdate() {
...
    
    List<CatalogItem> lCatalogItems = new ArrayList<CatalogItem>();

    CatalogItem item = new CatalogItem();
    item.setId(CATALOG_ITEM_ID);
    item.setManufacturer(CATALOG_ITEM_MANUFACTURER);
    item.setName(CATALOG_ITEM_NAME);
    item.setPrice(CATALOG_ITEM_PRICE);
    item.setInStock(CATALOG_ITEM_IN_STOCK);
    item.setPopularity(expectedPopularity);

    lCatalogItems.add(item);

    marshallingUpdateTemplate.executePostMethod(lCatalogItems);

    // have to commit the updates
    updateTemplate.executePostMethod(COMMIT);

...

}