【问题标题】:Date deserializer with local time zome具有本地时区的日期反序列化器
【发布时间】:2017-03-31 08:15:32
【问题描述】:

我正在尝试反序列化 Date 对象并设置本地时区。我从 UTC 的服务器获取日期,并且我的网站托管在同一时区,但是当我从服务器和我的网站收到时区的日期时。但是,客户端可以在另一个时区,所以我需要在客户端时区设置时间。为了更改时区,我在之前的请求中将它保存在会话中,但是当我要反序列化它时,会话为空。

我在一个对象中有一个日期参数

public class WorkDay implements Serializable {
 private static final long serialVersionUID = 1L;
 private int id;
 @JsonDeserialize(using = CustomJsonDateDeserializer.class)
 private Date date;

然后,我的反序列化方法

public class CustomJsonDateDeserializer extends JsonDeserializer<Date>
{
@Autowired
private HttpSession session;


@Override
public Date deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException, JsonProcessingException {

    String dateString = jsonparser.getText();

    @SuppressWarnings("resource")
    long createdate = new Scanner(dateString).useDelimiter("[^0-9]+").nextLong();

    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(createdate);

    TimeZone tz = (TimeZone)session.getAttribute("timezone");
    cal.setTimeZone(tz);

    return cal.getTime();
}

}

我在会话中保存了时区

@RequestMapping(value = "/home", method = RequestMethod.GET)
public String home(TimeZone timezone, Model model) {    

    UserAuth user = (UserAuth)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    if(user!= null)
    {

        try{
            session.setAttribute("timezone", timezone);

我在上一个请求中保存在会话中的时区之前,但在这个类中,会话为空。有什么方法可以从这个类的会话中获取数据吗?

谢谢!

【问题讨论】:

  • 目前还不清楚您想要实现什么 - Date 没有时区。它代表一个时间点——仅此而已。
  • 仍不清楚。听起来您现在实际上是在询问会话管理,这与日期反序列化无关。
  • 我正在尝试从会话中的反序列化类中获取时区。我正在尝试访问会话,因为我之前保存了它。但也许还有另一种方法可以恢复本地时区
  • 您似乎仍然错过了我的初始点:Date 值没有时区。它根本不是“在”特定时区。您的 cal 操作基本上什么都不做。你可以使用new Date(createdate)。现在您可以决定在特定时区渲染 Date - 但这是另一回事,反序列化部分与它完全无关。
  • 啊,好吧,我明白了。谢谢

标签: java json spring date json-deserialization


【解决方案1】:

@Autowired 在 Custom Deserializer 类中不起作用,因为该类的实例是由 Jackson 而不是 Spring 创建的。

就获取TimeZone 而言,session 存储在服务器端,因此将具有服务器的时区。因此,除非您使用任何其他值明确设置“时区”属性,否则您可以使用以下内容获取默认时区:

TimeZone defaultTimeZone = TimeZone.getDefault();

【讨论】:

  • 是的,我之前在会话中保存了客户端时区,但是如果我无法在 Deserializer 类中访问会话,我不知道如何获取它
  • 您如何在控制器类中获得session
  • 这是我的控制器@Controller @RequestMapping("/") public class AuthenticationController { @Autowired private HttpSession session; 然后我以问题@DarshanMehta 中显示的“家庭”方法保存会话
  • 自动装配session 并将其中的属性设置为request 听起来是个可怕的想法。会话不是线程安全的,请求到会话的映射并不总是多对一的。将其抽象为服务方法听起来比这更好,但是,我不知道底层需求是什么。
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多