中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

常平網(wǎng)站仿做百度手機(jī)衛(wèi)士

常平網(wǎng)站仿做,百度手機(jī)衛(wèi)士,泉州比較好的網(wǎng)站開(kāi)發(fā)建設(shè)公司,企業(yè)管理網(wǎng)絡(luò)圖RequestContextHolder多線程獲取不到request對(duì)象,調(diào)用feign接口時(shí),在Feign中的RequestInterceptor也獲取不到HttpServletRequest問(wèn)題解決方案。 1.RequestContextHolder多線程獲取不到request對(duì)象 異常信息,報(bào)錯(cuò)如下: 2024-07-0…

RequestContextHolder多線程獲取不到request對(duì)象,調(diào)用feign接口時(shí),在Feign中的RequestInterceptor也獲取不到HttpServletRequest問(wèn)題解決方案。

1.RequestContextHolder多線程獲取不到request對(duì)象
異常信息,報(bào)錯(cuò)如下:

2024-07-09 22:06:32.320 [pool-5-thread-2] ERROR com.mergeplus.handler.ObjectHandler:227 - class: interface org.jeecg.common.system.api.client.SysFeignClient, methodName=mergeRegion, error: {}
java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131)at org.springframework.web.context.support.WebApplicationContextUtils.currentRequestAttributes(WebApplicationContextUtils.java:313)at org.springframework.web.context.support.WebApplicationContextUtils$RequestObjectFactory.getObject(WebApplicationContextUtils.java:329)at org.springframework.web.context.support.WebApplicationContextUtils$RequestObjectFactory.getObject(WebApplicationContextUtils.java:324)at org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler.invoke(AutowireUtils.java:283)at jdk.proxy2/jdk.proxy2.$Proxy179.getHeaderNames(Unknown Source)at com.mergeplus.handler.ObjectHandler.lambda$doHandler$0(ObjectHandler.java:155)at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run$$$capture(CompletableFuture.java:1768)at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java)at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)at java.base/java.lang.Thread.run(Thread.java:833)

異常錯(cuò)誤截圖:
在這里插入圖片描述
2.解決方案

        // 設(shè)置子線程共享(重點(diǎn))final RequestAttributes attributes = RequestContextHolder.getRequestAttributes();merges.stream().map(e -> CompletableFuture.supplyAsync(() -> {JSONObject returnMap = null;try {if (e.getClientBean() != null) {// 設(shè)置當(dāng)前線程的 RequestAttributes(重點(diǎn))RequestContextHolder.setRequestAttributes(attributes);Object returnValue = e.getMethod().invoke(e.getClientBean(), jsonObject.get(e.getSourceKey()));if (returnValue == null) {return e;}returnMap = JSON.parseObject(JSON.toJSONString(returnValue));if (returnMap == null || returnMap.isEmpty()) {return e;}result.put(e.getTargetKey(), returnMap.get(jsonObject.get(e.getSourceKey())));} else {if (e.getUrl() == null || e.getUrl().trim().length() == 0) {return e;}//設(shè)置Http的HeaderHttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);//設(shè)置訪問(wèn)參數(shù)HashMap<String, Object> params = new HashMap<>();if (e.getKey() == null || e.getKey().trim().length() == 0) {params.put(e.getSourceKey(), jsonObject.get(e.getSourceKey()));}//設(shè)置訪問(wèn)的EntityHttpEntity entity = new HttpEntity<>(params, headers);// todoResponseEntity<Object> exchange = restTemplate.exchange(e.getUrl(), HttpMethod.GET, entity, Object.class);if (exchange == null) {return e;}Object body = exchange.getBody();if (body == null) {return e;}returnMap = JSON.parseObject(JSON.toJSONString(body));if (returnMap == null || returnMap.isEmpty()) {return e;}result.put(e.getTargetKey(), returnMap.get(jsonObject.get(e.getSourceKey())));//                    if (body instanceof Map) {
//                        returnMap = (Map) body;
//                        if (returnMap == null || returnMap.isEmpty()) {
//                            return e;
//                        }
//                        result.put(e.getTargetKey(), returnMap.get(jsonObject.get(e.getSourceKey())));
//                    }}} catch (Exception ex) {log.error("class: {}, methodName={}, error: {}", e.getClientBeanClazz(), e.getMethod().getName(), ex);} finally {RequestContextHolder.resetRequestAttributes(); // 記得在最后重置請(qǐng)求屬性(重點(diǎn))}return e;}, executor)).toList().stream().map(CompletableFuture::join).collect(Collectors.toList());

在這里插入圖片描述
在這里插入圖片描述
FeignInterceptorConfig代碼

package org.jeecg.config;import java.io.IOException;
import java.util.*;import feign.RequestTemplate;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.config.mqtoken.UserTokenContext;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.util.DateUtils;
import org.jeecg.common.util.PathMatcherUtil;
import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.common.util.TokenUtils;
import org.jeecg.config.sign.interceptor.SignAuthConfiguration;
import org.jeecg.config.sign.util.HttpUtils;
import org.jeecg.config.sign.util.SignUtil;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.http.MediaType;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;import feign.Feign;
import feign.Logger;
import feign.RequestInterceptor;
import feign.codec.Decoder;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import lombok.extern.slf4j.Slf4j;/*** @Description: FeignConfig* @author: JeecgBoot*/
@ConditionalOnClass(Feign.class)
@AutoConfigureBefore(FeignAutoConfiguration.class)
@Slf4j
@Configuration
public class FeignInterceptorConfig {@Beanpublic RequestInterceptor requestInterceptor() {return requestTemplate -> {ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (requestAttributes == null) {return;}//1.獲取請(qǐng)求對(duì)象HttpServletRequest request = requestAttributes.getRequest();Enumeration<String> headerNames = request.getHeaderNames();if (headerNames == null || !headerNames.hasMoreElements()) {return;}//2.獲取請(qǐng)求對(duì)象中的所有的頭信息(網(wǎng)關(guān)傳遞過(guò)來(lái)的)while (headerNames.hasMoreElements()) {String name = headerNames.nextElement();//頭的名稱// 跳過(guò)content-length,不然可能會(huì)報(bào)too many bites written問(wèn)題if ("content-length".equalsIgnoreCase(name)) {continue;}String value = request.getHeader(name);//頭名稱對(duì)應(yīng)的值// System.out.println("name:" + name + "::::::::value:" + value);//3.將頭信息傳遞給feign (restTemplate)requestTemplate.header(name,value);//                if (CommonConstant.X_ACCESS_TOKEN.equals(name) && StringUtils.isBlank(value)) {
//                    String token = UserTokenContext.getToken();
//                    requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, token);
//                }}//================================================================================================================//針對(duì)特殊接口,進(jìn)行加簽驗(yàn)證 ——根據(jù)URL地址過(guò)濾請(qǐng)求 【字典表參數(shù)簽名驗(yàn)證】// todoif (PathMatcherUtil.matches(Arrays.asList(PathMatcherUtil.SIGN_URL_LIST),requestTemplate.path())) {
//            if (PathMatcherUtil.matches(Arrays.asList(SignAuthConfiguration.SIGN_URL_LIST),requestTemplate.path())) {try {log.info("============================ [begin] fegin api url ============================");log.info(requestTemplate.path());log.info(requestTemplate.method());String queryLine = requestTemplate.queryLine();String questionMark="?";if(queryLine!=null && queryLine.startsWith(questionMark)){queryLine = queryLine.substring(1);}log.info(queryLine);if(requestTemplate.body()!=null){log.info(new String(requestTemplate.body()));}SortedMap<String, String> allParams = HttpUtils.getAllParams(requestTemplate.path(),queryLine,requestTemplate.body(),requestTemplate.method());String sign = SignUtil.getParamsSign(allParams);log.info(" Feign request params sign: {}",sign);log.info("============================ [end] fegin api url ============================");requestTemplate.header(CommonConstant.X_SIGN, sign);requestTemplate.header(CommonConstant.X_TIMESTAMP, String.valueOf(System.currentTimeMillis()));} catch (IOException e) {e.printStackTrace();}}//================================================================================================================};}}

3.相關(guān)大數(shù)據(jù)學(xué)習(xí)demo地址:
https://github.com/carteryh/big-data

http://www.risenshineclean.com/news/2679.html

相關(guān)文章:

  • 網(wǎng)站優(yōu)化網(wǎng)千鋒教育培訓(xùn)機(jī)構(gòu)怎么樣
  • 做色情網(wǎng)站多久會(huì)被抓網(wǎng)絡(luò)營(yíng)銷服務(wù)
  • 泉州市住房和城鄉(xiāng)建設(shè)部網(wǎng)站南寧網(wǎng)站優(yōu)化公司電話
  • 自制游戲軟件seo怎樣
  • 網(wǎng)站做維恩圖公司網(wǎng)站制作教程
  • 合肥軟件外包公司關(guān)鍵詞優(yōu)化排名查詢
  • 南寧微信網(wǎng)站制作周口網(wǎng)絡(luò)推廣哪家好
  • 做網(wǎng)站優(yōu)化要多少錢廣州網(wǎng)絡(luò)seo優(yōu)化
  • 網(wǎng)站名字大全有哪些鄭州網(wǎng)站優(yōu)化外包
  • 網(wǎng)站建設(shè)微信商城多少錢病毒式營(yíng)銷案例
  • wordpress摘要添加省略號(hào)鄂州網(wǎng)站seo
  • 網(wǎng)站的收費(fèi)標(biāo)準(zhǔn)品牌運(yùn)營(yíng)策劃
  • 建設(shè)網(wǎng)站怎么掙錢廣東網(wǎng)約車漲價(jià)
  • 山東自助seo建站商丘seo外包
  • 卡地亞手表官方網(wǎng)站查詢上海seo優(yōu)化服務(wù)公司
  • 展示型企業(yè)網(wǎng)站有哪些推廣普通話黑板報(bào)
  • 外包做網(wǎng)站要十幾萬(wàn)泉州排名推廣
  • 為什么做網(wǎng)站推廣站長(zhǎng)域名查詢工具
  • 北京網(wǎng)站手機(jī)站建設(shè)公司電話號(hào)碼上海牛巨微seo
  • 開(kāi)源網(wǎng)站建設(shè)網(wǎng)站alexa排名
  • 阿里云網(wǎng)站怎么備案域名網(wǎng)絡(luò)營(yíng)銷戰(zhàn)略
  • 個(gè)人網(wǎng)站建設(shè)網(wǎng)站一個(gè)完整的營(yíng)銷策劃方案范文
  • 網(wǎng)站開(kāi)發(fā)與維護(hù)的內(nèi)容百度seo搜索引擎優(yōu)化
  • 網(wǎng)站線框圖怎樣做萬(wàn)網(wǎng)官網(wǎng)
  • 常州制作網(wǎng)站信息百度指數(shù)搜索指數(shù)的數(shù)據(jù)來(lái)源
  • 網(wǎng)站備案與不備案的區(qū)別北京seo平臺(tái)
  • 防止入侵網(wǎng)站百度400電話
  • 現(xiàn)在建一個(gè)網(wǎng)站一年費(fèi)用只要幾百元網(wǎng)絡(luò)推廣平臺(tái)哪家公司最好
  • wordpress換電腦網(wǎng)站排名優(yōu)化教程
  • 做門戶網(wǎng)站的框架360地圖怎么添加商戶