问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

springboot+maven+elasticsearch6.7.1的版本整合报错,是包没下好还是...

发布网友 发布时间:2022-04-23 14:45

我来回答

1个回答

热心网友 时间:2022-04-11 05:56

elasticsearch6.1配置
config下的elasticsearch.yml
1.pom
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.1.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.39</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.properties
# Elasticsearch
elasticsearch.ip=xxx.xxx.xxx
elasticsearch.port=9300
elasticsearch.pool=5
2.配置config
@Configuration
public class ElasticsearchConfig {

private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchConfig.class);

/**
* elk集群地址
*/
@Value("${elasticsearch.ip}")
private String hostName;
/**
* 端口
*/
@Value("${elasticsearch.port}")
private String port;
/**
* 集群名称
*/
@Value("${elasticsearch.cluster.name}")
private String clusterName;

/**
* 连接池
*/
@Value("${elasticsearch.pool}")
private String poolSize;

@Bean
public TransportClient init() {
LOGGER.info("初始化开始。。。。。");
TransportClient transportClient = null;

try {
// 配置信息
Settings esSetting = Settings.builder()
.put("client.transport.sniff", true)//增加嗅探机制,找到ES集群
.put("thread_pool.search.size", Integer.parseInt(poolSize))//增加线程池个数,暂时设为5
.build();
//配置信息Settings自定义,下面设置为EMPTY
transportClient = new PreBuiltTransportClient(Settings.EMPTY);
TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(hostName), Integer.valueOf(port));
transportClient.addTransportAddresses(transportAddress);

} catch (Exception e) {
LOGGER.error("elasticsearch TransportClient create error!!!", e);
}

return transportClient;
}
}
3.配置工具类ElasticsearchUtils
@Component
public class ElasticsearchUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchUtils.class);

@Autowired
private TransportClient transportClient;

private static TransportClient client;

@PostConstruct
public void init() {
client = this.transportClient;
}

/**
* 创建索引
*
* @param index
* @return
*/
public static boolean createIndex(String index) {
if (!isIndexExist(index)) {
LOGGER.info("Index is not exits!");
}
CreateIndexResponse indexresponse = client.admin().indices().prepareCreate(index).execute().actionGet();
LOGGER.info("执行建立成功?" + indexresponse.isAcknowledged());

return indexresponse.isAcknowledged();
}

/**
* 删除索引
*
* @param index
* @return
*/
public static boolean deleteIndex(String index) {
if (!isIndexExist(index)) {
LOGGER.info("Index is not exits!");
}
DeleteIndexResponse dResponse = client.admin().indices().prepareDelete(index).execute().actionGet();
if (dResponse.isAcknowledged()) {
LOGGER.info("delete index " + index + " successfully!");
} else {
LOGGER.info("Fail to delete index " + index);
}
return dResponse.isAcknowledged();
}

/**
* 判断索引是否存在
*
* @param index
* @return
*/
public static boolean isIndexExist(String index) {
IndicesExistsResponse inExistsResponse = client.admin().indices().exists(new IndicesExistsRequest(index)).actionGet();
if (inExistsResponse.isExists()) {
LOGGER.info("Index [" + index + "] is exist!");
} else {
LOGGER.info("Index [" + index + "] is not exist!");
}
return inExistsResponse.isExists();
}

/**
* 数据添加,正定ID
*
* @param jsonObject 要增加的数据
* @param index 索引,类似数据库
* @param type 类型,类似表
* @param id 数据ID
* @return
*/
public static String addData(JSONObject jsonObject, String index, String type, String id) {

IndexResponse response = client.prepareIndex(index, type, id).setSource(jsonObject).get();

LOGGER.info("addData response status:{},id:{}", response.status().getStatus(), response.getId());

return response.getId();
}

/**
* 数据添加
*
* @param jsonObject 要增加的数据
* @param index 索引,类似数据库
* @param type 类型,类似表
* @return
*/
public static String addData(JSONObject jsonObject, String index, String type) {
return addData(jsonObject, index, type, UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
}

/**
* 通过ID删除数据
*
* @param index 索引,类似数据库
* @param type 类型,类似表
* @param id 数据ID
*/
public static void deleteDataById(String index, String type, String id) {

DeleteResponse response = client.prepareDelete(index, type, id).execute().actionGet();

LOGGER.info("deleteDataById response status:{},id:{}", response.status().getStatus(), response.getId());
}

/**
* 通过ID 更新数据
*
* @param jsonObject 要增加的数据
* @param index 索引,类似数据库
* @param type 类型,类似表
* @param id 数据ID
* @return
*/
public static void updateDataById(JSONObject jsonObject, String index, String type, String id) {

UpdateRequest updateRequest = new UpdateRequest();

updateRequest.index(index).type(type).id(id).doc(jsonObject);

client.update(updateRequest);

}

/**
* 通过ID获取数据
*
* @param index 索引,类似数据库
* @param type 类型,类似表
* @param id 数据ID
* @param fields 需要显示的字段,逗号分隔(缺省为全部字段)
* @return
*/
public static Map<String, Object> searchDataById(String index, String type, String id, String fields) {

GetRequestBuilder getRequestBuilder = client.prepareGet(index, type, id);

if (StringUtils.isNotEmpty(fields)) {
getRequestBuilder.setFetchSource(fields.split(","), null);
}

GetResponse getResponse = getRequestBuilder.execute().actionGet();

return getResponse.getSource();
}

/**
* 使用分词查询
*
* @param index 索引名称
* @param type 类型名称,可传入多个type逗号分隔
* @param fields 需要显示的字段,逗号分隔(缺省为全部字段)
* @param matchStr 过滤条件(xxx=111,aaa=222)
* @return
*/
public static List<Map<String, Object>> searchListData(String index, String type, String fields, String matchStr) {
return searchListData(index, type, 0, 0, null, fields, null, false, null, matchStr);
}

/**
* 使用分词查询
*
* @param index 索引名称
* @param type 类型名称,可传入多个type逗号分隔
* @param fields 需要显示的字段,逗号分隔(缺省为全部字段)
* @param sortField 排序字段
* @param matchPhrase true 使用,短语精准匹配
* @param matchStr 过滤条件(xxx=111,aaa=222)
* @return
*/
public static List<Map<String, Object>> searchListData(String index, String type, String fields, String sortField, boolean matchPhrase, String matchStr) {
return searchListData(index, type, 0, 0, null, fields, sortField, matchPhrase, null, matchStr);
}

/**
* 使用分词查询
*
* @param index 索引名称
* @param type 类型名称,可传入多个type逗号分隔
* @param size 文档大小*
* @param fields 需要显示的字段,逗号分隔(缺省为全部字段)
* @param sortField 排序字段
* @param matchPhrase true 使用,短语精准匹配
* @param highlightField 高亮字段
* @param matchStr 过滤条件(xxx=111,aaa=222)
* @return
*/
public static List<Map<String, Object>> searchListData(String index, String type, Integer size, String fields, String sortField, boolean matchPhrase, String highlightField, String matchStr) {
return searchListData(index, type, 0, 0, size, fields, sortField, matchPhrase, highlightField, matchStr);
}

/**
* 使用分词查询
*
* @param index 索引名称
* @param type 类型名称,可传入多个type逗号分隔
* @param startTime 开始时间
* @param endTime 结束时间
* @param size 文档大小*
* @param fields 需要显示的字段,逗号分隔(缺省为全部字段)
* @param sortField 排序字段
* @param matchPhrase true 使用,短语精准匹配
* @param highlightField 高亮字段
* @param matchStr 过滤条件(xxx=111,aaa=222)
* @return
*/
public static List<Map<String, Object>> searchListData(String index, String type, long startTime, long endTime, Integer size, String fields, String sortField, boolean matchPhrase, String highlightField, String matchStr) {

SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
if (StringUtils.isNotEmpty(type)) {
searchRequestBuilder.setTypes(type.split(","));
}
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

if (startTime > 0 && endTime > 0) {
boolQuery.must(QueryBuilders.rangeQuery("processTime")
.format("epoch_millis")
.from(startTime)
.to(endTime)
.includeLower(true)
.includeUpper(true));
}

//搜索的的字段
if (StringUtils.isNotEmpty(matchStr)) {
for (String s : matchStr.split(",")) {
String[] ss = s.split("=");
if (ss.length > 1) {
if (matchPhrase == Boolean.TRUE) {
boolQuery.must(QueryBuilders.matchPhraseQuery(s.split("=")[0], s.split("=")[1]));
} else {
boolQuery.must(QueryBuilders.matchQuery(s.split("=")[0], s.split("=")[1]));
}
}

}
}

// 高亮(xxx=111,aaa=222)
if (StringUtils.isNotEmpty(highlightField)) {
HighlightBuilder highlightBuilder = new HighlightBuilder();

//highlightBuilder.preTags("<span style='color:red' >");//设置前缀
//highlightBuilder.postTags("</span>");//设置后缀

// 设置高亮字段
highlightBuilder.field(highlightField);
searchRequestBuilder.highlighter(highlightBuilder);
}

searchRequestBuilder.setQuery(boolQuery);

if (StringUtils.isNotEmpty(fields)) {
searchRequestBuilder.setFetchSource(fields.split(","), null);
}
searchRequestBuilder.setFetchSource(true);

if (StringUtils.isNotEmpty(sortField)) {
searchRequestBuilder.addSort(sortField, SortOrder.DESC);
}

if (size != null && size > 0) {
searchRequestBuilder.setSize(size);
}

//打印的内容 可以在 Elasticsearch head 和 Kibana 上执行查询
LOGGER.info("\n{}", searchRequestBuilder);

SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();

long totalHits = searchResponse.getHits().totalHits;
long length = searchResponse.getHits().getHits().length;

LOGGER.info("共查询到[{}]条数据,处理数据条数[{}]", totalHits, length);

if (searchResponse.status().getStatus() == 200) {
// 解析对象
return setSearchResponse(searchResponse, highlightField);
}

return null;

}

/**
* 使用分词查询,并分页
*
* @param index 索引名称
* @param type 类型名称,可传入多个type逗号分隔
* @param currentPage 当前页
* @param pageSize 每页显示条数
* @param startTime 开始时间
* @param endTime 结束时间
* @param fields 需要显示的字段,逗号分隔(缺省为全部字段)
* @param sortField 排序字段
* @param matchPhrase true 使用,短语精准匹配
* @param highlightField 高亮字段
* @param matchStr 过滤条件(xxx=111,aaa=222)
* @return
*/
public static EsPage searchDataPage(String index, String type, int currentPage, int pageSize, long startTime, long endTime, String fields, String sortField, boolean matchPhrase, String highlightField, String matchStr) {
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
if (StringUtils.isNotEmpty(type)) {
searchRequestBuilder.setTypes(type.split(","));
}
searchRequestBuilder.setSearchType(SearchType.QUERY_THEN_FETCH);

// 需要显示的字段,逗号分隔(缺省为全部字段)
if (StringUtils.isNotEmpty(fields)) {
searchRequestBuilder.setFetchSource(fields.split(","), null);
}

//排序字段
if (StringUtils.isNotEmpty(sortField)) {
searchRequestBuilder.addSort(sortField, SortOrder.DESC);
}

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

if (startTime > 0 && endTime > 0) {
boolQuery.must(QueryBuilders.rangeQuery("processTime")
.format("epoch_millis")
.from(startTime)
.to(endTime)
.includeLower(true)
.includeUpper(true));
}

// 查询字段
if (StringUtils.isNotEmpty(matchStr)) {
for (String s : matchStr.split(",")) {
String[] ss = s.split("=");
if (matchPhrase == Boolean.TRUE) {
boolQuery.must(QueryBuilders.matchPhraseQuery(s.split("=")[0], s.split("=")[1]));
} else {
boolQuery.must(QueryBuilders.matchQuery(s.split("=")[0], s.split("=")[1]));
}
}
}

// 高亮(xxx=111,aaa=222)
if (StringUtils.isNotEmpty(highlightField)) {
HighlightBuilder highlightBuilder = new HighlightBuilder();

//highlightBuilder.preTags("<span style='color:red' >");//设置前缀
//highlightBuilder.postTags("</span>");//设置后缀

// 设置高亮字段
highlightBuilder.field(highlightField);
searchRequestBuilder.highlighter(highlightBuilder);
}

searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
searchRequestBuilder.setQuery(boolQuery);

// 分页应用
searchRequestBuilder.setFrom(currentPage).setSize(pageSize);

// 设置是否按查询匹配度排序
searchRequestBuilder.setExplain(true);

//打印的内容 可以在 Elasticsearch head 和 Kibana 上执行查询
LOGGER.info("\n{}", searchRequestBuilder);

// 执行搜索,返回搜索响应信息
SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();

long totalHits = searchResponse.getHits().totalHits;
long length = searchResponse.getHits().getHits().length;

LOGGER.debug("共查询到[{}]条数据,处理数据条数[{}]", totalHits, length);

if (searchResponse.status().getStatus() == 200) {
// 解析对象
List<Map<String, Object>> sourceList = setSearchResponse(searchResponse, highlightField);

return new EsPage(currentPage, pageSize, (int) totalHits, sourceList);
}

return null;

}

/**
* 高亮结果集 特殊处理
*
* @param searchResponse
* @param highlightField
*/
private static List<Map<String, Object>> setSearchResponse(SearchResponse searchResponse, String highlightField) {
List<Map<String, Object>> sourceList = new ArrayList<Map<String, Object>>();
StringBuffer stringBuffer = new StringBuffer();

for (SearchHit searchHit : searchResponse.getHits().getHits()) {
searchHit.getSourceAsMap().put("id", searchHit.getId());

if (StringUtils.isNotEmpty(highlightField)) {

System.out.println("遍历 高亮结果集,覆盖 正常结果集" + searchHit.getSourceAsMap());
Text[] text = searchHit.getHighlightFields().get(highlightField).getFragments();

if (text != null) {
for (Text str : text) {
stringBuffer.append(str.string());
}
//遍历 高亮结果集,覆盖 正常结果集
searchHit.getSourceAsMap().put(highlightField, stringBuffer.toString());
}
}
sourceList.add(searchHit.getSourceAsMap());
}

return sourceList;
}
}
4.配置分页工具类EsPage
public class EsPage {
// 指定的或是页面参数
private int currentPage; // 当前页
private int pageSize; // 每页显示多少条

// 查询es结果
private int recordCount; // 总记录数
private List<Map<String, Object>> recordList; // 本页的数据列表

// 计算
private int pageCount; // 总页数
private int beginPageIndex; // 页码列表的开始索引(包含)
private int endPageIndex; // 页码列表的结束索引(包含)

/**
* 只接受前4个必要的属性,会自动的计算出其他3个属性的值
*
* @param currentPage
* @param pageSize
* @param recordCount
* @param recordList
*/
public EsPage(int currentPage, int pageSize, int recordCount, List<Map<String, Object>> recordList) {
this.currentPage = currentPage;
this.pageSize = pageSize;
this.recordCount = recordCount;
this.recordList = recordList;

// 计算总页码
pageCount = (recordCount + pageSize - 1) / pageSize;

// 计算 beginPageIndex 和 endPageIndex
// >> 总页数不多于10页,则全部显示
if (pageCount <= 10) {
beginPageIndex = 1;
endPageIndex = pageCount;
}
// >> 总页数多于10页,则显示当前页附近的共10个页码
else {
// 当前页附近的共10个页码(前4个 + 当前页 + 后5个)
beginPageIndex = currentPage - 4;
endPageIndex = currentPage + 5;
// 当前面的页码不足4个时,则显示前10个页码
if (beginPageIndex < 1) {
beginPageIndex = 1;
endPageIndex = 10;
}
// 当后面的页码不足5个时,则显示后10个页码
if (endPageIndex > pageCount) {
endPageIndex = pageCount;
beginPageIndex = pageCount - 10 + 1;
}
}
}

public int getCurrentPage() {
return currentPage;
}

public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}

public int getPageSize() {
return pageSize;
}

public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}

public int getRecordCount() {
return recordCount;
}

public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}

public List<Map<String, Object>> getRecordList() {
return recordList;
}

public void setRecordLiswww.scjinhan.com?st<Map<String, Object>> recordList) {
this.recordList = recordList;
}

public int getPageCount() {
return pageCount;
}

public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}

public int getBeginPageIndex() {
return beginPageIndex;
}

public void setBeginPageIndex(int beginPageIndex) {
this.beginPageIndex = beginPageIndex;
}

public int getEndPageIndex() {
return endPageIndex;
}

public void setEndPageIndex(int endPageIndex) {
this.endPageIndex = endPageIndex;
}
}
5.测试
@Test
public void createIndexTest() {
ElasticsearchUtils.createIndex("ymq_index");
ElasticsearchUtils.createIndex("ymq_indexsssss");
}
springboot+maven+elasticsearch6.7.1的版本整合报错,是包没下好还是...

elasticsearch.port=9300elasticsearch.pool=52.配置config@Configurationpublic class ElasticsearchConfig {private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchConfig.class);/*** elk集群地址*/@Value("${elasticsearch.ip}")private String hostName;/*** 端口*/@Value("${elasticsearch.port}...

SpringBoot 整合 Elasticsearch

在SpringBoot中整合Elasticsearch,主要有两种方法,但官方推荐的方案已过时,而SpringBoot与Elasticsearch的同步更新并不一致,这可能导致使用过程中的不便。下面将简要概述如何通过High Level Client实现整合。首先,你需要在项目中引入相关依赖。在pom.xml文件中添加Elasticsearch High Level Client的坐标:&lt;depende...

springboot整合es出现elasticsearch health check failed

使用springboot整合elasticsearch实现搜索功能, 配置如下:可以确认es的9300端口、9200端口正常启动,可连接 但启动项目是报出如下错误:Elasticsearch health check failed相关错误信息 方法1:添加spring.elasticsearch.rest.uris配置,具体配置如下:方法2:配置文件中,配置关闭对elasticsearch的健康检查 比较推荐方法1...

Spring Boot整合ElasticSearch实现增删改查基本示例

spring-boot-starter-data-elasticsearch注意:ElasticSearch版本号与Spring Boot版本号是有关联的,本文笔者Spring Boot版本号是2.1.6,因此安装的ElasticSearch版本号是7.7.0。 package com.opendi.generator.elasticsearch.model;import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework...

SpringBoot如何集成Elasticsearch,这篇就够了

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档。我们将Elasticsearch里存储文档数据和关系型数据库MySQL存储数据的概念进行一个类比如下图。二、集成步骤 1.依赖引入 pom依赖如下,主要列出SpringBoot依赖版本以及ElasticSearch版本,其他需要依赖自行添加(本文使用的具体版本为 elasticsearch-rest-...

【一】实战:SpringBoot与Elasticsearch完美融合,WebFlux响应式编程实...

为了搭建ES环境,首先需要安装Elasticsearch和Kibana的最新版本。Elasticsearch以其毫秒级查询亿级数据的能力,成为大数据处理的利器。官方提供的安装文档提供了详细的指引,但本文将提供简化的步骤:步骤1:创建ES数据存储、插件和日志目录。步骤2:运行ES容器。为了查看生成的token,选择使用"后台模式"(detached ...

Spring整合ElasticSearch之通过注解动态配置Setting

springboot整合ElasticSearch遇到的坑,首先我这里先列一下我用到的版本,版本详情如下:1、springboot : 2.1.8.RELEASE 2、spring-data-elasticsearch-3.1.10.RELEASE 2、Elasticsearch:6.6.2 3、分词器:ik6.6.2版本 4、kibana-6.6.0 1.版本问题         这个...

springboot整合ES的基本操作

springboot整合ES的基本操作 1,如何整合引入依赖坐标 2,简单的进行测试 首先要明确springboot对于elasticsearch的high-level并没有进行整合,这就表明我们需要手动导入坐标依赖 &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter&lt;/artifactId&gt; &lt;/dependency&gt; &lt;...

SpringBoot3集成ElasticSearch

环境配置与工程搭建首先,确保下载对应版本的安装包,以避免兼容性问题。启动服务时,可对配置文件进行个性化调整,如端口设置和资源优化。在工程中,SpringBoot3依赖elasticsearch-java的8.7.1版本,通过starter-elasticsearch组件接入。基础用法使用Document和Field注解,通过JsonIgnoreProperties解决JSON映射问题,...

ElasticSearch进阶篇之ElasticSearch-Rest-Client在SpringBoot项目中实 ...

9300端口的API使用spring-data-elasticsearch:transport-api.jar,但这种方式由于SpringBoot版本不一致,导致与Elasticsearch版本不匹配,不推荐使用。9200端口的API可以采用多种方式,具体操作请参考官方文档。在SpringBoot项目中整合ElasticSearch-Rest-Client,首先创建检索服务。添加相应的依赖,确保公共依赖与My...

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
两台手机同在一个抖音号,一台关闭了活跃状态,另一台是不是也显示关闭... 为什么会免费存在推股票的QQ群 谁能推荐几个好的股票类的QQ群? 创作出《大中国》的高枫曾经红极一时,为什么后来变得籍籍无名? 芬达是哪个国家的饮料 走步前做哪些热身动作 2010年有什么大事发生啊???做课件要用的 哪个软件可以查看局域网IP是否通,它是小格子形式的,通的就是绿色的... 我家电脑IP地址写成其他人的怎么办,我家里是小区光钎的,写成别人的没事... 局域网里为什么有的IP是重复的,而且流量很小? 首付可以用公积金贷款吗 Apache Log4j 2.0值得升级吗 Could not initialize class org.apache.logging.log4j.core.LoggerContext 房子只付了首付请问能在银行贷款吗 maven 架包后面api与core有什么不同 怎样用maven引入log4j 首付贷款怎么申请 炸鸡柳正常放油锅里多长时间捞出来? 外酥里嫩的炸鸡柳,比外面买的还好吃,香酥炸鸡柳怎么做? 100度油温炸鸡柳几分钟能熟 一百度油温炸鸡柳4分钟能熟吗 炸鸡柳多长时间能炸熟 一百度的油温炸鸡柳4分钟能熟吗,炸完肉是白色的吗还掺杂着调料 鸡柳空气炸锅需要几分钟? 炸鸡柳一般几分钟能熟 除了五菱宏光,谁还是2019年中国受欢迎的MPV? 2018年MPV销量排行榜怎么样?哪款车的性价比最高? 冬至吃汤圆,家用宝骏360,6.42万就能入手,全系6座空间舒适 宝骏360价格多少,达到了国几的环保标准? 国产MPV车型中,哪个性价比比较高? eclipse从svn导出项目报错,请问怎么解决 在导入maven工程时候出现以下错误,不知道什么原因 怎么利用maven快速构建SSM框架 maven中怎么添加jar包不生效 Maven中导入jar包能不能批量导入 如何把github上下载下来的maven源代码zip文件打包成可运行的jar文件 在maven里没有引入呀 怎么有hibernate-core 如何使用Spring开发和监控线程池服务 maven中使用freemarker,如何配置需要哪些配置文件 spring mvc mybatis maven serviceimpl里面的方法怎么测试 log4j.xml在web.xml里怎么加载 ssm框架中spring是怎样从mybaitis映射文件中读取到sql语句的 webmagic log4j.xml 放在哪 log4j配置之后出现错误 直播带货想拍一发二 怎么设置 拼多多拍一发二怎么关停? 抖音直播拍一单发两单违规吗 怎样可以把微信群聊红点去掉?有时不想进群聊天,但又有强迫症,怕看见红点 淘宝卖家写买一发二如何理解? 怎么优化笔记本使电脑速度变快?