使用自定义 DateFormatter 配置转换服务

问题描述 投票:0回答:2

我正在尝试在以下文档的帮助下向我的 spring/thymeleaf 应用程序添加自定义 DateFormatter : https://web.archive.org/web/20140606082846/http://www.thymeleaf.org/doc/html/Thymeleaf-Spring3.html#conversions-utility-object

问题是我的 bean 定义没有使用 xml 配置,而是使用具有以下实现的 WebConfig.java 类:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.myapp.web.controller","net.atos.wfs.wts.adminportal.web.domain"})
public class WebConfig extends WebMvcConfigurerAdapter {

private static final Logger LOG = LoggerFactory.getLogger(WebConfig.class);


@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
    localeChangeInterceptor.setParamName("lang");
    registry.addInterceptor(localeChangeInterceptor);
}

@Bean
public LocaleResolver localeResolver() {
    CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
    cookieLocaleResolver.setDefaultLocale(StringUtils.parseLocaleString("en"));
    return cookieLocaleResolver;
}

@Bean
public ServletContextTemplateResolver templateResolver() {
    ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".html");
    //NB, selecting HTML5 as the template mode.
    resolver.setTemplateMode("HTML5");
    resolver.setCacheable(false);
    return resolver;

}

public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.setTemplateResolver(templateResolver());
    engine.setMessageResolver(messageResolver());
    engine.addDialect(new LayoutDialect());
    return engine;
}

@Bean
public ViewResolver viewResolver() {

    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());
    viewResolver.setOrder(1);
    viewResolver.setViewNames(new String[]{"*"});
    viewResolver.setCache(false);
    return viewResolver;
}

@Bean
public IMessageResolver messageResolver() {
    SpringMessageResolver messageResolver = new SpringMessageResolver();
    messageResolver.setMessageSource(messageSource());
    return messageResolver;
}

@Override
public void addFormatters(FormatterRegistry registry) {
    super.addFormatters(registry);
    registry.addFormatter(new DateFormatter());
}

@Bean
public MessageSource messageSource() {

    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("/WEB-INF/messages/messages");
    // if true, the key of the message will be displayed if the key is not
    // found, instead of throwing a NoSuchMessageException
    messageSource.setUseCodeAsDefaultMessage(true);
    messageSource.setDefaultEncoding("UTF-8");
    // # -1 : never reload, 0 always reload
    messageSource.setCacheSeconds(0);
    return messageSource;
}

 }

这是我的自定义日期格式化程序的代码:

public class DateFormatter implements Formatter<Date> {

    @Autowired
    private MessageSource messageSource;


    public DateFormatter() {
        super();
    }

    public Date parse(final String text, final Locale locale) throws ParseException {
        final SimpleDateFormat dateFormat = createDateFormat(locale);
        return dateFormat.parse(text);
    }

    public String print(final Date object, final Locale locale) {
        final SimpleDateFormat dateFormat = createDateFormat(locale);
        return dateFormat.format(object);
    }

    private SimpleDateFormat createDateFormat(final Locale locale) {
    
        //The following line is not working (nullPointerException on messageSource)
        //final String format = this.messageSource.getMessage("date.format", null, locale);
        //The following line is working :
        final String format = "dd/MM/yyyy";
        final SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        dateFormat.setLenient(false);
        return dateFormat;
    }

}

我的问题是:如何添加能够使用 @Autowired 元素的自定义格式化程序?

xml配置就是这个:

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>

  ...    
  <mvc:annotation-driven conversion-service="conversionService" />
  ...

  <!-- **************************************************************** -->
  <!--  CONVERSION SERVICE                                              -->
  <!--  Standard Spring formatting-enabled implementation               -->
  <!-- **************************************************************** -->
  <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="formatters">
      <set>
        <bean class="thymeleafexamples.stsm.web.conversion.VarietyFormatter" />
        <bean class="thymeleafexamples.stsm.web.conversion.DateFormatter" />
      </set>
    </property>
  </bean>

  ...
    
</beans>

我尝试在 WebConfig 类中使用以下配置:

@Bean
    public FormattingConversionServiceFactoryBean conversionService() {
        FormattingConversionServiceFactoryBean conversionService = new FormattingConversionServiceFactoryBean();
        Set<Formatter<?>> formatters = new TreeSet<Formatter<?>>();
        formatters.add(new DateFormatter());
        conversionService.setFormatters(formatters);
        return conversionService;
    }

但是在这种情况下,我的应用程序中没有考虑格式化程序。

提前致谢, 安托万。

spring thymeleaf
2个回答
3
投票

将其添加到您的 WebMvcConfigurerAdapter

@Override
public void addFormatters(FormatterRegistry registry) {
    registry.addFormatter(dateFormatter);
}

@Autowired
private DateFormatter dateFormatter;

@Bean
public DateFormatter dateFormatter() {
    return new DateFormatter("dd/MM/yyyy");
}

1
投票

我使用了以下配置类,并且能够调用自定义格式化程序。我无法获取要传入的 messageSource,它始终为 null,因为自动配置 bean 是稍后在应用程序启动时创建的。

@Configuration
public class ThymeleafConfig {
    @Autowired
    private MessageSource messageSource;

    @Bean
    public SpringSecurityDialect securityDialect() {
        return new SpringSecurityDialect();
    }

    @Bean
    public ConversionService conversionService() {
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService( false );
        conversionService.addFormatter( dateFormatter() );
        return conversionService;
    }

    @Bean
    public DateFormatter dateFormatter() {
        return new DateFormatter( messageSource );
    }

}

您还需要确保在模板中在字段周围使用双括号。即

<td th:text="${{user.createDate}}">12-MAR-2015</td>
© www.soinside.com 2019 - 2024. All rights reserved.