• 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共享给子线程

  • 相关阅读:
    项目集管理
    项目集管理:战略项目与多项目管理之道
    项目组合管理、项目集管理、项目管理和组织级项目管理之间的关系
    极限编程简述
    项目群管理
    数据结构基础温故-4.树与二叉树(下)
    数据结构基础温故-4.树与二叉树(中)
    数据结构基础温故-4.树与二叉树(上)
    使用Unity3D的设计思想实现一个简单的C#赛车游戏场景
    数据结构基础温故-3.队列
  • 原文地址:https://www.cnblogs.com/hongdada/p/16826339.html
Copyright © 2020-2023  润新知