【问题标题】:Time is not returned as dynamic because of static issue由于静态问题,时间未作为动态返回
【发布时间】:2018-09-11 09:33:30
【问题描述】:

我需要通过我的服务类显示最新的时间戳:

@Service
public class UserServiceImpl implements UserService {

    private static final AtomicInteger counter = new AtomicInteger();
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss");
    static Timestamp timestamp = new Timestamp(System.currentTimeMillis());

    static List<User> users = new ArrayList<User>(
            Arrays.asList(
                          new User("123","abc","A1234567", "a529794b3ea9c05d8f0b5f354dac25e5", "Role-A","Screen A","Execute",sdf.format(timestamp) )));

    @Override
    public List<User> getAll(int offset, int count) {
        return users;
    }

输出如下:

[{"hkid":"123","username":"abc","passportNo":"A1234567","tokenId":"a529794b3ea9c05d8f0b5f354dac25e5","role":"Role-A","permission":"Execute","timestamp":"2018.04.02.12.16.19","screen":"Screen A"}]

现在的问题是时间戳不会作为当前时间戳返回,因为我的时间戳字段是静态的。我需要进行哪些必要的更改才能始终获取当前时间戳。我必须使用静态对象。

补充一句:在 pojo 中,我将时间戳记为字符串

public class User implements Serializable {

    private String id;
    private String username;
    private String passportNo;
    private String tokenId;
    private String role;
    private String Screen ;
    private String permission;
    private String timestamp ;

【问题讨论】:

    标签: java date timestamp


    【解决方案1】:

    您可以在每次调用 getAll 时动态更新它:

    @Override
    public List<User> getAll(int offset, int count) {
        String ts = sdf.format(new Timestamp(System.currentTimeMillis()));
        users.forEach(u -> u.setTimestamp(ts));
        return users;
    }
    

    【讨论】:

      【解决方案2】:

      Arrays.asList(
                                new User("123","abc","A1234567", "a529794b3ea9c05d8f0b5f354dac25e5", "Role-A","Screen A","Execute",sdf.format(timestamp) )))
      

      在你的方法里面。在 Spring 框架中,bean 被加载为单例,因此使用类变量是一种不好的做法。只使用方法变量。

      【讨论】:

        【解决方案3】:

        声明为静态的成员变量仅在构造期间初始化一次。 在您的情况下,timestampUser 对象数组都需要动态创建(或者您需要为User 对象添加时间戳的setter 方法并在此期间调用它)。 因此,在您的 getAll 方法中,您需要创建用户数组以及时间戳,然后将其格式化为响应。

        @Override
        public List<User> getAll(int offset, int count) {
            List<User> response = new ArrayList<User>();
            Timestamp ts = new Timestamp(System.currentTimeMillis());
            response.add(new User("123","abc","A1234567", "a529794b3ea9c05d8f0b5f354dac25e5", "Role-A","Screen A","Execute",sdf.format(ts) ));
            return response;
        }
        

        与 setter 的变化:

        @Override
        public List<User> getAll(int offset, int count) {
            Timestamp ts = new Timestamp(System.currentTimeMillis());
            for(User user : users)
            {
               user.setTimestamp(sdf.format(ts));
            }
            return users;
        }
        

        【讨论】:

        • 这一行出现异常 List response = ArrayList();
        • 抱歉,我忘记创建新的 ArrayList。我更新了帖子。
        猜你喜欢
        • 1970-01-01
        • 2013-07-27
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多