005-spring-data-elasticsearch 3.0.0.0使用【三】-spring-data之Spring数据扩展

本文介绍Spring Data提供的Web支持特性,包括Querydsl扩展、DomainClassConverter的使用及Pageable和Sort实例的解析等。这些特性简化了Spring MVC应用程序中与数据交互的过程。

1.8、Spring数据扩展

  这些扩展使Spring Data在各种环境下的使用成为可能。目前大部分的整合都是针对Spring MVC。

1.8.1、Querydsl扩展

  Querydsl是一个框架,它可以通过流畅的API构建静态类型的SQL查询。

  几个Spring Data模块通过QueryDslPredicateExecutor提供与Querydsl的集成。

示例、QueryDslPredicateExecutor接口

public interface QueryDslPredicateExecutor<T> {
//查找并返回与Predicate匹配的单个实体
  Optional<T> findById(Predicate predicate);  
//查找并返回与谓词匹配的所有实体
  Iterable<T> findAll(Predicate predicate);   
//返回匹配Predicate的实体的数量
  long count(Predicate predicate);            
//判断返回与Predicate匹配的实体是否存在
  boolean exists(Predicate predicate);        

  // … more functionality omitted.
}
View Code

要使用Querydsl支持,只需在存储库接口上扩展QueryDslPredicateExecutor即可。

interface UserRepository extends CrudRepository<User, Long>, QueryDslPredicateExecutor<User> {
}

以上使用Querydsl谓词可以编写类型安全查询。

Predicate predicate = user.firstname.equalsIgnoreCase("dave").and(user.lastname.startsWithIgnoreCase("mathews"));

userRepository.findAll(predicate);

1.8.2、web支持

  如果模块支持存储库编程模型,则Spring Data模块附带各种Web支持。与Web相关的东西需要类路径上的Spring MVC JAR,其中一些甚至提供了与Spring HATEOAS的集成。通常,通过在JavaConfig配置类中使用@EnableSpringDataWebSupport注释来启用集成支持。

  启用web支持  

@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
class WebConfiguration {}

  或者xml配置

<bean class="org.springframework.data.web.config.SpringDataWebConfiguration" />

<!-- If you're using Spring HATEOAS as well register this one *instead* of the former -->
<bean class="org.springframework.data.web.config.HateoasAwareSpringDataWebConfiguration" />
View Code

基本的web支持

  上面显示的配置设置将注册一些基本组件:

    DomainClassConverter使Spring MVC能够根据请求参数或路径变量来解析存储库管理的域类的实例。

    HandlerMethodArgumentResolver实现,以便Spring MVC根据请求参数解析Pageable和Sort实例。

DomainClassConverter

  DomainClassConverter允许您直接在Spring MVC控制器方法签名中使用域类型,因此您不必通过存储库手动查找实例:

@Controller
@RequestMapping("/users")
class UserController {

  @RequestMapping("/{id}")
  String showUserForm(@PathVariable("id") User user, Model model) {

    model.addAttribute("user", user);
    return "userForm";
  }
}
View Code

  正如你所看到的,该方法直接接收一个用户实例,不需要进一步查找。通过让Spring MVC首先将路径变量转换为域类的id类型并最终通过在为域类型注册的存储库实例上调用findById(...)来访问实例,可以解决该实例。

  目前,存储库必须实施CrudRepository才有资格被发现用于转换。

HandlerMethodArgumentResolvers for Pageable and Sort

  上面的配置片段还注册了PageableHandlerMethodArgumentResolver以及SortHandlerMethodArgumentResolver的一个实例。注册使页面和排序成为有效的控制器方法参数  

@Controller
@RequestMapping("/users")
class UserController {

  private final UserRepository repository;

  UserController(UserRepository repository) {
    this.repository = repository;
  }

  @RequestMapping
  String showUsers(Model model, Pageable pageable) {

    model.addAttribute("users", repository.findAll(pageable));
    return "users";
  }
}
View Code

  此方法签名将导致Spring MVC尝试使用以下默认配置从请求参数派生Pageable实例:

表1.对Pageable实例评估的请求参数

page

您想要检索的页面,索引为0,默认为0。

size

要检索的页面大小,默认为20。

sort

属性应该按格式属性property(,ASC | DESC)排序。默认排序方向是升序。如果您想切换路线,请使用多个排序参数,例如 ?sort=firstname&sort=lastname,asc.

更多spring扩展以及支持web支持请查看

 

逐条解读这个yml文件 version: &#39;2&#39; services: redis: image: redis:5.0.4 container_name: jetlinks-redis ports: - "10399:10399" volumes: - "./data/redis:/data" command: redis-server --appendonly yes --requirepass "JetLinks@redis" environment: - TZ=Asia/Shanghai elasticsearch: image: elasticsearch:6.8.23 container_name: jetlinks-elasticsearch environment: ES_JAVA_OPTS: "-Djava.net.preferIPv4Stack=true -Xms2g -Xmx2g" TZ: Asia/Shanghai transport.host: 0.0.0.0 discovery.type: single-node bootstrap.memory_lock: "true" discovery.zen.minimum_master_nodes: 1 discovery.zen.ping.unicast.hosts: elasticsearch volumes: - ./data/elasticsearch:/usr/share/elasticsearch/data ports: - "9200:9200" - "9300:9300" kibana: image: kibana:6.8.23 container_name: jetlinks-kibana environment: ELASTICSEARCH_URL: http://elasticsearch:9200 links: - elasticsearch:elasticsearch ports: - "5601:5601" depends_on: - elasticsearch postgres: image: postgres:11-alpine container_name: jetlinks-postgres ports: - "5432:5432" volumes: - "./data/postgres:/var/lib/postgresql/data" environment: POSTGRES_PASSWORD: jetlinks POSTGRES_DB: jetlinks TZ: Asia/Shanghai ui: image: registry.cn-shenzhen.aliyuncs.com/jetlinks/jetlinks-ui-vue:2.2.0 container_name: jetlinks-pro-ui ports: - 9000:80 environment: - "API_BASE_PATH=http://jetlinks:8844/" #API根路径 volumes: - "./data/upload:/usr/share/nginx/html/upload" depends_on: - jetlinks jetlinks: build: . container_name: jetlinks-pro ports: - 8844:8844 # API端口 - 11883:11883 # 通过openAPI使用mqtt订阅平台消息 - 1883-1890:1883-1890 # MQTT端口 - 8801-8810:8801-8810 # 预留端口 - 8801-8810:8801-8810/udp # udp预留端口 - 5060-5061:5060-5061/udp # udp端口 volumes: - "./data:/application/data" # 临时保存协议目录 - "./data/upload:/application/static/upload" # 持久化上传的文件 - "/home/nslvzy/license.lic:/application/license.lic" - "/home/nslvzy/publicCerts.keystore:/application/publicCerts.keystore" environment: - "TZ=Asia/Shanghai" - "JAVA_OPTS=-Xms4G -Xmx8G -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/application/static/upload/dump.hprof" # jvm参数,根据情况调整 - "hsweb.file.upload.static-location=http://172.23.69.181:9000/api/upload" #上传的静态文件访问根地址,为本机的IP或者域名。需要前后端都能访问。 - "spring.r2dbc.url=r2dbc:postgresql://postgres:5432/jetlinks" #数据库连接地址 - "spring.r2dbc.username=postgres" - "spring.r2dbc.password=jetlinks" - "spring.elasticsearch.uris=elasticsearch:9200" # - "spring.elasticsearch.username=admin" # - "spring.elasticsearch.password=admin" - "spring.reactor.debug-agent.enabled=false" #设置为false能提升性能 - "spring.redis.host=redis" - "spring.redis.port=6379" - "spring.redis.password=JetLinks@redis" # - "captcha.enabled=false" #关闭验证码 - "jetlinks.things.metadata.preprocessor.enabled=true" - "zlmedia.play.device-auth.enabled=true" - "zlmedia.play.device-auto-push.enabled=true" - "zlmedia.hook.auth.enabled=false" - "media.onvif.enabled=true" - "logging.level.io.r2dbc=warn" - "logging.level.org.springframework.data=warn" - "logging.level.org.springframework=warn" - "logging.level.org.jetlinks=warn" - "logging.level.org.hswebframework=warn" - "logging.level.org.springframework.data.r2dbc.connectionfactory=warn" - "network.resources[0]=1883-1890/tcp" - "network.resources[1]=8801-8810" - "network.resources[2]=5060-5061/udp" - "license.subject=license" - "license.publicAlias=publicCert" - "license.storePass=a123456" - "license.licensePath=/application/license.lic" - "license.publicKeysStorePath=/application/publicCerts.keystore" links: - redis:redis - postgres:postgres - elasticsearch:elasticsearch depends_on: - elasticsearch - postgres - redis
07-25
<think>我们被要求逐条解释这个docker-compose.yml文件,并给出本地化配置修改建议。 根据用户提供的yml文件,我们将按服务进行分解,并指出哪些部分需要根据本地环境修改。 文件结构: version: &#39;2&#39; # 指定docker-compose文件格式版本 services: # 定义各个服务 redis: ... # 第一个服务 elasticsearch: ... # 第二个服务 ... 等等 我们将逐个服务解释,并指出需要本地化的地方。 注意:本地化修改通常包括: - 端口映射:避免与主机已有端口冲突 - 数据卷路径:修改为主机上的合适路径 - 环境变量:特别是密码、密钥等敏感信息 - 镜像版本:确保使用稳定的版本 - 容器名称:避免重复 - 资源限制:根据主机资源调整 另外,注意一些配置可能依赖于主机环境(如IP地址、域名等)也需要修改。 开始逐条解释:</think>### Docker Compose文件逐条解析及本地化配置建议 以下是对YAML文件的逐行解析,需本地化的配置项已用**加粗**标注(共7类核心修改点): --- #### 🔹 全局配置 ```yaml version: &#39;2&#39; # Docker Compose版本[^1] services: # 服务定义入口 ``` --- #### 🔹 Redis服务 ```yaml redis: image: redis:5.0.4 # ✅ 建议升级到新版(如7.0+)[^3] container_name: jetlinks-redis ports: - "10399:10399" # ⚠️ **需修改**:主机端口避免冲突(如改为6380) volumes: - "./data/redis:/data" # ⚠️ **需修改**:左侧路径改为绝对路径(如/opt/jetlinks/redis) command: redis-server --appendonly yes --requirepass "JetLinks@redis" # ⚠️ **需修改**:密码建议通过.env文件注入 environment: - TZ=Asia/Shanghai ``` **本地化重点**: 1. 端口映射(避免10399端口冲突) 2. 数据持久化目录(使用主机绝对路径) 3. 密码安全(避免硬编码) --- #### 🔹 Elasticsearch服务 ```yaml elasticsearch: image: elasticsearch:6.8.23 # ✅ 建议升级到7.x+[^3] environment: ES_JAVA_OPTS: "-Xms2g -Xmx2g" # ⚠️ **需修改**:内存限制根据主机配置调整 volumes: - ./data/elasticsearch:/usr/share/elasticsearch/data # ⚠️ **需修改**:左侧路径改为绝对路径 ``` **本地化重点**: 1. JVM内存限制(根据主机内存调整) 2. 数据目录路径(使用主机绝对路径) --- #### 🔹 PostgreSQL服务 ```yaml postgres: image: postgres:11-alpine ports: - "5432:5432" # ⚠️ **需修改**:若主机已用5432端口则需调整 volumes: - "./data/postgres:/var/lib/postgresql/data" # ⚠️ **需修改**:左侧路径改为绝对路径 environment: POSTGRES_PASSWORD: jetlinks # ⚠️ **需修改**:生产环境需加强密码 ``` **本地化重点**: 1. 端口冲突检查(默认5432端口易冲突) 2. 数据库密码强度(避免使用默认值) --- #### 🔹 UI服务 ```yaml ui: image: registry.cn-shenzhen.aliyuncs.com/... # 第方镜像 environment: - "API_BASE_PATH=http://jetlinks:8844/" # ⚠️ **需修改**:改为实际API地址(如http://192.168.1.100:8844) ``` **本地化重点**: 1. API地址配置(需替换为可访问的主机IP/DNS) --- #### 🔹 Jetlinks主服务 ```yaml jetlinks: ports: - 8844:8844 - 11883:11883 - 1883-1890:1883-1890 # ⚠️ **需修改**:检查主机端口占用情况 volumes: - "/home/nslvzy/license.lic:/application/license.lic" # ⚠️ **需修改**:左侧路径需真实存在 environment: - "hsweb.file.upload.static-location=http://172.23.69.181:9000/api/upload" # ⚠️ **需修改**:IP需替换为本机IP - "network.resources[0]=1883-1890/tcp" # 需与ports配置一致 ``` **本地化重点**: 1. 端口范围冲突检查(1883-1890为MQTT常用端口) 2. 文件挂载路径验证(确保license.lic文件存在) 3. 静态文件访问地址(必须可被外部访问) --- ### 📌 本地化配置清单 | 配置类型 | 示例位置 | 修改建议 | |----------------|------------------------------|-----------------------------------| | **端口映射** | `ports` | 扫描主机端口冲突(`netstat -tuln`)| | **数据卷路径** | `volumes`左侧路径 | 改为绝对路径(如`/opt/jetlinks/data`) | | **敏感信息** | `command/requirepass` | 通过`.env`文件注入[^1] | | **IP地址** | `API_BASE_PATH` | 替换为实际公网IP/DNS | | **资源限制** | `ES_JAVA_OPTS` | 根据主机内存调整(不超过80%) | | **镜像版本** | `image`标签 | 避免使用`latest`,指定稳定版本 | | **文件挂载** | `license.lic`路径 | 验证文件存在且可读 | --- ### 🔧 配置验证步骤 1. 创建`.env`文件管理敏感信息: ```ini # .env REDIS_PASSWORD=SecurePwd@123 POSTGRES_PASSWORD=PG_StrongPwd!456 ``` 2. 启动前检查配置: ```bash docker-compose config # 验证语法[^1] docker-compose up -d --force-recreate # 重建容器 docker-compose logs -f jetlinks # 查看启动日志 ``` > **关键提示**:所有**主机资源引用**(路径/IP/端口)和**敏感信息**必须本地化[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值