Рубрики
Без рубрики

Пример поиска весенней загрузки + гибернации

– Весенняя загрузка + Пример поиска в режиме гибернации

Автор оригинала: Michael Good.

Здесь мы создадим пример веб-приложения Spring Boot с механизмом шаблонов Hibernate Search + Thymeleaf и развернем его как WAR для Wildfly 10.1.

Используемые технологии:

  1. Пружинный ботинок 1.5.6.ВЫПУСК
  2. Java 8
  3. Поиск в режиме гибернации 5.6.1. Окончательный
  4. Встроенный Tomcat, Wildfly 8.1 Окончательный и 10.1 Окончательный

1. Структура проекта

Стандартная структура проекта Maven

1. Зависимости проекта



    4.0.0

    com.mkyong
    spring-boot-web-wildfly-search
    0.0.1
    war
    mkyong-wildfly-spring-boot
    Spring Boot Web Hibernate Search Example

    
        org.springframework.boot
        spring-boot-starter-parent
        1.5.6.RELEASE
         
    

    
        UTF-8
        UTF-8
        1.8
        1.1.9
    

    

        
            org.springframework.boot
            spring-boot-starter-web
            
        

        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        

        
            org.springframework.boot
            spring-boot-starter-data-jpa
        

        
        
            org.hibernate
            hibernate-search-engine
            5.6.1.Final
            
                
                    org.jboss.logging
                    jboss-logging
                
            
        

        
        
            org.hibernate
            hibernate-search-orm
            5.6.1.Final
            
                
                    org.jboss.logging
                    jboss-logging
                
            
        

        
            org.hsqldb
            hsqldb
            runtime
        

        
            javax.servlet
            javax.servlet-api
            provided
        

        
            org.jboss.logging
            jboss-logging
            3.3.0.Final
        

        
            ch.qos.logback
            logback-core
            1.1.9
        

    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    WAR
                    true
                    com.mkyong.WildflySpringBootApplication
                
                
                    
                        
                            repackage
                        
                    
                
            
        
    


2. Модель

Для этого примера приложения мы создаем веб-сайт, который позволяет вам искать редкие бейсбольные карточки. Итак, мы делаем нашу модель бейсбольной карточкой и помечаем поля, доступные для поиска.

package com.mkyong.model;

import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Indexed
@Entity
public class BaseballCard {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @Field
    private String name;
    @Field
    private String rarityLevel;
    @Field
    private int year;
	
    //getters n setters

}

3. Хранилище

Здесь у нас есть данные Spring CrudRepository для модели бейсбольной карточки, которая позволит нам выполнять необходимые функции создания и чтения.

package com.mkyong.dao;

import org.springframework.data.repository.CrudRepository;

import com.mkyong.model.BaseballCard;

public interface BaseballCardRepository extends CrudRepository {
}

4. Поиск в режиме гибернации

package com.mkyong.service;

import com.mkyong.model.BaseballCard;
import org.apache.lucene.search.Query;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.Search;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import java.util.List;

@Service
public class HibernateSearchService {


    @Autowired
    private final EntityManager centityManager;


    @Autowired
    public HibernateSearchService(EntityManager entityManager) {
        super();
        this.centityManager = entityManager;
    }


    public void initializeHibernateSearch() {

        try {
            FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(centityManager);
            fullTextEntityManager.createIndexer().startAndWait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Transactional
    public List fuzzySearch(String searchTerm) {

        FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(centityManager);
        QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(BaseballCard.class).get();
        Query luceneQuery = qb.keyword().fuzzy().withEditDistanceUpTo(1).withPrefixLength(1).onFields("name")
                .matching(searchTerm).createQuery();

        javax.persistence.Query jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, BaseballCard.class);

        // execute search

        List BaseballCardList = null;
        try {
            BaseballCardList = jpaQuery.getResultList();
        } catch (NoResultException nre) {
            ;// do nothing

        }

        return BaseballCardList;


    }
}

Это настраивает Службу поиска в режиме гибернации для доступа.

package com.mkyong;

import javax.persistence.EntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.mkyong.service.HibernateSearchService;
@EnableAutoConfiguration 
@Configuration
public class HibernateSearchConfiguration {

	@Autowired
	private EntityManager bentityManager;

	@Bean
	HibernateSearchService hibernateSearchService() {
		HibernateSearchService hibernateSearchService = new HibernateSearchService(bentityManager);
		hibernateSearchService.initializeHibernateSearch();
		return hibernateSearchService;
	}
}

5. Услуга для модели

Это простой сервис, который добавляет три карты в хранилище для нашего примера. Для демонстрации твердых принципов программирования существует отдельный интерфейс для сервиса.

package com.mkyong.service;

public interface CardService {

    void addCards();
    
}
package com.mkyong.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.mkyong.dao.BaseballCardRepository;
import com.mkyong.model.BaseballCard;

@Service
public class CardServiceImpl implements CardService {

    @Autowired
    BaseballCardRepository cardrepository;

    BaseballCard TedWilliams = new BaseballCard();
    BaseballCard BobGibson = new BaseballCard();
    BaseballCard HonusWagner = new BaseballCard();

    public void addCards() {
        TedWilliams.setName("Ted Williams");
        TedWilliams.setYear(1954);
        TedWilliams.setRarityLevel("Very Rare");

        cardrepository.save(TedWilliams);

        BobGibson.setName("Bob Gibson");
        BobGibson.setYear(1959);
        BobGibson.setRarityLevel("Very Rare");

        cardrepository.save(BobGibson);

        HonusWagner.setName("Honus Wagner");
        HonusWagner.setYear(1909);
        HonusWagner.setRarityLevel("Rarest");

        cardrepository.save(HonusWagner);

        System.out.println("Cards have been added : " + cardrepository.findAll());

    }
}

6. Контроллер

Контроллер отвечает за подключение серверных служб к нашему интерфейсному шаблону Thymeleaf.

package com.mkyong.controller;

import com.mkyong.model.BaseballCard;
import com.mkyong.service.CardService;
import com.mkyong.service.HibernateSearchService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@Controller
public class CardController {

    @Autowired
    private HibernateSearchService searchservice;

    @Autowired
    private CardService cardservice;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String search(@RequestParam(value = "search", required = false) String q, Model model) {
        List searchResults = null;
        try {
            cardservice.addCards();
            searchResults = searchservice.fuzzySearch(q);

        } catch (Exception ex) {
            // here you should handle unexpected errors
            // ...
            // throw ex;
        }
        model.addAttribute("search", searchResults);
        return "index";

    }

}

7. Конфигурация

Теперь нам нужно настроить наш Thymeleaf и перевести поиск в спящий режим.

#==================================
# = Thymeleaf configurations 
#==================================
spring.thymeleaf.check-template-location=true
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.content-type=text/html
spring.thymeleaf.cache=false
server.contextPath=/
#===================================
#= 
# Specify the Lucene Directory
spring.jpa.properties.hibernate.search.default.directory_provider = filesystem

# Using the filesystem DirectoryProvider you also have to specify the default
# base directory for all indexes 
spring.jpa.properties.hibernate.search.default.indexBase = indexpath

8. Шаблон листа Тимьяна

Для нашего шаблона Thymeleaf у нас есть две цели: разрешить пользователю выполнять поиск и отображать результаты поиска после завершения поиска. К счастью, в Thymeleaf есть условные операторы, которые позволяют нам отображать результаты, если поиск пользователя возвращает элементы.





    
    Mkyong Wildfly Example
    
    
    
    
    
    
    



Search Results

ID name rarity level year
Text ... Text ... Text ... Text...

9. Применение пружинной загрузки

package com.mkyong;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WildflySpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(WildflySpringBootApplication.class, args);
    }

}

10. Демонстрация

Запустите приложение Spring Boot с помощью встроенного контейнера Tomcat по умолчанию.

$ mvn spring-boot:run

Доступ http://localhost:8080/

Я искал “Ted”, и результаты отображаются в таблице,

11. Развернуть файл ВОЙНЫ в Wildfly

Wildfly – это сервер приложений с открытым исходным кодом JBoss. Wildfly можно скачать с их официального сайта

Wildfly 10 поставляется с: ActiveMQ Artemis, Развертывания HASingleton, Компоненты, управляемые одноэлементными сообщениями (Mdb), и группы доставки MDB, Компоненты сеансов без сохранения состояния и Компоненты, управляемые сообщениями, Автоматическое определение размера пула, Гибернация 5

Дикая муха 8 и 9: Эти версии не поставляются со встроенными технологиями, которые есть у Wildfly 10. Это означает, что нам не нужно будет делать исключения в их файле конфигурации.

11.1 Исключите встроенный контейнер Tomcat.

	
           org.springframework.boot
            spring-boot-starter-web
            
                
                    org.springframework.boot
                    spring-boot-starter-tomcat
                
            
        

11.2 Расширяет springbootservletинициализатор

package com.mkyong;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class WildflySpringBootApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(WildflySpringBootApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(WildflySpringBootApplication.class, args);
    }

}

11.3 Maven создайте и скопируйте файл WAR в JBoss Wildfly и запустите его.

$ mvn package

11.4 Рекомендации для Wildfly 10

Для Wildfly 10 нам необходимо внести дополнительные изменения из-за технологий, которые поставляются в комплекте с ним. В нашем случае мы используем поиск в режиме гибернации, который упакован в Wildfly 10.

Для пользователей Wildfly 10 вам необходимо создать persistence.xml файл и введите:

wildfly.jpa.hibernate.search.module = none

Сделано.

Скачать Исходный Код

Рекомендации

  1. Документация по поиску в режиме гибернации 5.6
  2. Развертывание приложений Весенней Загрузки
  3. Лист Тимьяна + Весна
  4. Весенняя загрузка – Развертывание файла войны в Tomcat

Оригинал: “https://mkyong.com/spring-boot/spring-boot-hibernate-search-example/”