Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java WebMVCConfigureAdapter的Spring addFormatters未调用_Java_Spring_Spring Mvc_Spring Boot_Converter - Fatal编程技术网

Java WebMVCConfigureAdapter的Spring addFormatters未调用

Java WebMVCConfigureAdapter的Spring addFormatters未调用,java,spring,spring-mvc,spring-boot,converter,Java,Spring,Spring Mvc,Spring Boot,Converter,我试图在SpringBoot应用程序中实现一个转换器,但由于某种原因,addFormatters(FormatterRegistry FormatterRegistry)的覆盖从未被调用。令人困惑的是,调用了其他被重写的方法,addInterceptors工作正常。已为此应用启用安全性 @EnableWebMvc @Configuration @ComponentScan(basePackages = {"com.company.web"}) public class WebMvcConfig

我试图在
Spring
Boot应用程序中实现一个转换器,但由于某种原因,
addFormatters(FormatterRegistry FormatterRegistry)
的覆盖从未被调用。令人困惑的是,调用了其他被重写的方法,
addInterceptors
工作正常。已为此应用启用安全性

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = {"com.company.web"})
public class WebMvcConfig extends WebMvcConfigurerAdapter {

  private final Logger logger = LoggerFactory.getLogger(this.getClass());

  @Autowired
  private RequestMappingHandlerAdapter requestMappingHandlerAdapter;

  @Inject
  private TenantIdentifierInterceptorAdapter multiTenancyInterceptor;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    logger.info("adding interceptor");
    registry.addInterceptor(multiTenancyInterceptor);
  }

  //THIS IS NOT CALLED
  @Override
  public void addFormatters(FormatterRegistry formatterRegistry) {
    logger.info("adding converters"); 
    formatterRegistry.addConverter(new StringToPersonConverter());
  }

  private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {"classpath:/META-INF/resources/",
      "classpath:/resources/", "classpath:/static/", "classpath:/public/"};

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**").addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS)
        .setCachePeriod(3600).resourceChain(true).addResolver(new PathResourceResolver());
  }

  @PostConstruct
  public void init() {
    requestMappingHandlerAdapter.setIgnoreDefaultModelOnRedirect(true);
  }

}
出于某种原因,如果我将此代码添加到文件中,格式化程序代码将被命中,但我得到一个错误“需要一个ServletContext来配置默认的servlet处理”,并且应用程序将无法编译

@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource messageSource = new       ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}

我不是100%确定,但您是否尝试从类中删除
@EnableWebMvc
注释?因为它不应该在那里:

如果您想保留Spring Boot MVC功能,并且只想添加额外的MVC配置(拦截器、格式化程序、视图控制器等),您可以添加自己的@configuration类,类型为WebMVCConfigureAdapter,但无需启用WebMVC


迪纳姆先生的评论就是答案。我已经删除了
@EnableWebMvc
并删除了方法
addFormatters
,然后添加了:

@Bean
StringToPersonConverter stringToPersonConverter() {
  return new StringToPersonConverter();
}

我已经解决了一个类似的错误

具有多个实现的自定义配置

@配置
公共类WebConfig扩展了WebMVCConfigureAdapter
{
@自动连线
私有转换服务转换服务;
@凌驾
public void addArgumentResolver(列出ArgumentResolver)
{
argumentResolvers.add(新的RequestTenantResolverComposite(conversionService));
}
}
如果FormattingConversionService实现了在注入之前创建的ConversionService bean,则不会调用该方法


我使用spring verions 4.3.6的转换服务注释解决了我的问题。

您是否配置了具有超级类WebMvcConfigurationSupport的bean?
如果您这样做,它将禁用WebMvcAutoConfiguration引导程序。
检查此代码:

@Configuration
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {

仍然不起作用:(我不确定我是否需要'@EnableWebMvc',但我看到了很多文档,所以我把它放在了里面。删除它不起作用。感谢兄弟的回复!添加
@EnableWebMvc
会禁用它的Spring Boot自动配置(因此,您现在可能禁用了您不知道的Spring Boot部分)。实际上,您的配置是重新配置默认情况下已配置的内容(如静态资源).但您基本上是在使事情变得复杂,Spring Boot自动注册转换器和格式化程序,只需将您的
StringToPersonConverter
bean和Spring Boot将配置其余部分)因此,基本上删除
@EnableWebMvc
并用
@Bean
替换
@addFormatters
用于
StringToPersonConverter
。太棒了!成功了。我删除了
@EnableWebMvc
和方法
addFormatters
,然后添加了
@Bean StringToPersonConverter StringToPersonConverter(){return new StringToPersonConverter();}
我不确定发生了什么,但这已停止工作。我收到错误“找不到匹配的编辑器或转换策略”您好,欢迎使用SO。请在回答中包含任何相关代码。将图像链接到代码是个坏主意。
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
    private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

    @Autowired(required = false)
    public void setConfigurers(List<WebMvcConfigurer> configurers) {
        if (!CollectionUtils.isEmpty(configurers)) {
            this.configurers.addWebMvcConfigurers(configurers);
        }
    }

    //...

    @Override
    protected void addFormatters(FormatterRegistry registry) {
        this.configurers.addFormatters(registry);
    }

    //...

}
public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware {

    //...

    @Bean
    public FormattingConversionService mvcConversionService() {
        FormattingConversionService conversionService = new DefaultFormattingConversionService();
        addFormatters(conversionService);
        return conversionService;
    }

    /**
     * Override this method to add custom {@link Converter}s and {@link Formatter}s.
     */
    protected void addFormatters(FormatterRegistry registry) {
    }

    //...

}
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter
{
    @Autowired
    private ConversionService conversionService;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers)
    {
        argumentResolvers.add(new RequestTenantResolverComposite(conversionService));
    }
}
@Configuration
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {