gpt4 book ai didi

java - 如何根据用户设置在 Spring MVC 中创建动态格式化程序?

转载 作者:行者123 更新时间:2023-11-29 08:45:51 25 4
gpt4 key购买 nike

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

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 documentation on formatters而且我似乎看不到任何方法可以根据给定的 patterndate 进行 spring 格式化,因为模式被硬编码到注释中。我考虑过实现自己的 Formatter 但我只能实现 print 方法,因为我在 中没有可用的 pattern解析方法:

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;
}

}

似乎让用户能够更改日期格式将是一个非常常见的用例,所以我一定在这里遗漏了一些东西。我如何让它工作?

谢谢!

最佳答案

如果模式依赖于用户设置,您应该将其存储在日期字段之外的另一个对象中。恕我直言,最好有一个包含此日期模式的 UserSettings 类,以及一个能够返回提取的 Principal 设置的 UserSettingService来自请求或从 Session 中提取的用户 ID。

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

ServletRequestAttributes requestAttributes =
(ServletRequestAttributes ) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();

如果你只需要一个 session 属性:

RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
String userId = requestAttributes.getAttribute("userid", RequestAttributes.SCOPE_SESSION);

对于您的示例,您可以这样使用它:

注入(inject)实用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());
}
}

一些接口(interface)

interface PatternService {
String getPattern(String userID);
}

interface UserExtractor {
String getCurrentUserId();
}

从 Session 属性或请求中的 Principal 获取 userId 的示例实现

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();
}
}

关于java - 如何根据用户设置在 Spring MVC 中创建动态格式化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25427688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com