HttpServletRequest共享给子线程

异常信息:

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.
# 大概意思是 request attributes 未共享给子线程

重新生成 DispatcherServlet 和 RequestContextFilter

import lombok.extern.slf4j.Slf4j;
import org.modelmapper.ModelMapper;
import org.modelmapper.config.Configuration.AccessLevel;
import org.modelmapper.convention.MatchingStrategies;
import org.modelmapper.convention.NamingConventions;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.web.servlet.ConditionalOnMissingFilterBean;
import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties;
import org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.web.context.request.RequestContextListener;
import org.springframework.web.filter.RequestContextFilter;
import org.springframework.web.servlet.DispatcherServlet;


/**
 * @author qhong
 * @date 2022/3/17 17:52
 **/
@Slf4j
@Configuration
@Scope("prototype")
public class BeanConfig {

	@Bean
	public ModelMapper getModelMapper() {
		ModelMapper modelMapper = new ModelMapper();
		modelMapper.getConfiguration()
				.setFieldMatchingEnabled(false)
				//匹配私有字段
				.setFieldAccessLevel(AccessLevel.PRIVATE)
				//松散的匹配源和目标属性
				//.setMatchingStrategy(MatchingStrategies.LOOSE)
				//严格的匹配源和目标属性
				.setMatchingStrategy(MatchingStrategies.STRICT)
				//代表没有命名约定,这适用于所有属性名
				.setSourceNamingConvention(NamingConventions.NONE)
				.setDestinationNamingConvention(NamingConventions.NONE);
		return modelMapper;
	}


	// 重新生成 DispatcherServlet 和 RequestContextFilter
	@Bean(name = DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
	public DispatcherServlet dispatcherServlet(WebMvcProperties webMvcProperties) {
		DispatcherServlet dispatcherServlet = new DispatcherServlet();
		dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest());
		dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest());
		dispatcherServlet.setThrowExceptionIfNoHandlerFound(webMvcProperties.isThrowExceptionIfNoHandlerFound());
		dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents());
		dispatcherServlet.setEnableLoggingRequestDetails(webMvcProperties.isLogRequestDetails());
		dispatcherServlet.setThreadContextInheritable(true);
		log.debug("init project dispatcher servlet");
		return dispatcherServlet;
	}

	@Bean
	@ConditionalOnMissingBean({RequestContextListener.class, RequestContextFilter.class})
	@ConditionalOnMissingFilterBean(RequestContextFilter.class)
	public RequestContextFilter requestContextFilter() {
		OrderedRequestContextFilter orderedRequestContextFilter = new OrderedRequestContextFilter();
		orderedRequestContextFilter.setThreadContextInheritable(true);
		log.debug("init project request context filter");
		return orderedRequestContextFilter;
	}

}

参考:

No thread-bound request found> HttpServletRequest共享给子线程

posted @ 2022-10-25 21:09  hongdada  阅读(192)  评论(0编辑  收藏  举报