Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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 如何根据用户设置在SpringMVC中创建动态格式化程序?_Java_Spring_Spring Mvc - Fatal编程技术网

Java 如何根据用户设置在SpringMVC中创建动态格式化程序?

Java 如何根据用户设置在SpringMVC中创建动态格式化程序?,java,spring,spring-mvc,Java,Spring,Spring Mvc,在我的应用程序中,我有这样一个类: public class DateField { private String pattern; private Date date; public DateField(Date date, String pattern) { this.date = date; this.pattern = pattern; } public Date getDate() { return this.date; }

在我的应用程序中,我有这样一个类:

public class DateField {

  private String pattern;
  private Date date;

  public DateField(Date date, String pattern) {
    this.date = date;
    this.pattern = pattern;
  }

  public Date getDate() {
    return this.date;
  }

  public String getPattern() {
    return this.pattern;
  }

}
模式
由用户定义,用户可以随时使用管理界面进行更改,而无需重新启动应用程序。我已经阅读了,我似乎看不到任何方法可以让spring根据给定的
模式
格式化
日期
,因为模式是硬编码到注释中的。我想实现我自己的
格式化程序
,但我只能实现
打印
方法,因为我在
解析
方法中没有可用的
模式

public class DateFieldFormatter implements Formatter<DateField> {

  @Override
  public String print(DateField dateField,
                      Locale locale) {
    if (dateField == null) {
      return "";
    }
    return new SimpleDateFormat(dateField.getPattern()).format(dateField.getDate());
  }

  @Override
  public DateField parse(String dateString,
                         Locale locale) throws ParseException {
    // I don't know what the pattern is here.
    return null;
  }

}
公共类DateFieldFormatter实现格式化程序{
@凌驾
公共字符串打印(日期字段日期字段,
区域设置(区域设置){
if(dateField==null){
返回“”;
}
返回新的SimpleDataFormat(dateField.getPattern()).format(dateField.getDate());
}
@凌驾
公共日期字段解析(字符串dateString,
语言环境)引发语法异常{
//我不知道这里的模式是什么。
返回null;
}
}
似乎让用户能够更改日期格式将是一个非常常见的用例,所以我这里肯定遗漏了一些东西。我怎样才能让它工作


谢谢

如果模式取决于用户设置,则应将其存储在日期字段以外的其他对象中。因此,最好有一个包含此日期模式的
UserSettings
类,以及一个
UserSettingService
能够返回从请求中提取的
主体
或从
会话
提取的用户id中给定的设置

Spring提供了通过
RequestContextHolder.currentContextAttributes()
从应用程序中的任何位置访问当前
请求的可能性,前提是您注册了
RequestContextListener
。您可以通过以下方式访问请求:

ServletRequestAttributes requestAttributes =
    (ServletRequestAttributes ) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
如果您只需要会话属性:

RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
String userId = requestAttributes.getAttribute("userid", RequestAttributes.SCOPE_SESSION);
根据您的示例,您可以这样使用它:

ServletRequestAttributes requestAttributes =
    (ServletRequestAttributes ) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
注入实用程序bean的格式化程序

public class DateFieldFormatter implements Formatter<DateField> {

    @Autowired
    PatternService patternService;
    @Autowired
    UserExtractor userExtractor;

    @Override
    public String print(DateField dateField,
            Locale locale) {
        if (dateField == null) {
            return "";
        }
        return new SimpleDateFormat(dateField.getPattern()).format(dateField.getDate());
        // or return new SimpleDateFormat(getPattern()).format(dateField.getDate());
    }

    @Override
    public DateField parse(String dateString,
            Locale locale) throws ParseException {
        String pattern = getPattern();
        DateField dateField = new DateField();
        dateField.setPattern(pattern);
        Date date = new SimpleDateFormat(pattern).parse(dateString);
        dateField.setDate(date);
        return dateField;
    }

    private String getPattern() {
        return patternService.getPattern(userExtractor.getCurrentUserId());
    }
}
从请求中的会话属性或主体获取用户ID的示例实现

static class SessionUserExtractor implements UserExtractor {
    @Override
    public String getCurrentUserId() {
        RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
        return (String) requestAttributes.getAttribute("userid", RequestAttributes.SCOPE_SESSION);
    }
}

static class PrincipalUserExtractor implements UserExtractor {

    @Override
    public String getCurrentUserId() {
        ServletRequestAttributes requestAttributes =
                (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        return request.getUserPrincipal().getName();
    }
}

模式和日期存储在一起的原因是,它不是应用程序中所有日期的模式,特别是这个日期的模式。即使物体被分开,这对我的问题仍然没有帮助。我如何告诉spring使用哪种模式而不在注释中对其进行硬编码?