Автор оригинала: Michael Good.
Здесь мы создадим пример веб-приложения Spring Boot с механизмом шаблонов Hibernate Search + Thymeleaf и развернем его как WAR для Wildfly 10.1.
Используемые технологии:
- Пружинный ботинок 1.5.6.ВЫПУСК
- Java 8
- Поиск в режиме гибернации 5.6.1. Окончательный
- Встроенный 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 ListfuzzySearch(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) { ListsearchResults = 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
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
Сделано.
Скачать Исходный Код
Рекомендации
- Документация по поиску в режиме гибернации 5.6
- Развертывание приложений Весенней Загрузки
- Лист Тимьяна + Весна
- Весенняя загрузка – Развертывание файла войны в Tomcat
Оригинал: “https://mkyong.com/spring-boot/spring-boot-hibernate-search-example/”