Проблема получения даты в весенней загрузке с hibernate от mysql - PullRequest
0 голосов
/ 27 сентября 2018

Я новичок в весенней загрузке и столкнулся с одной проблемой при получении даты из базы данных.Я сохранил дату в формате UTC, но когда я пытаюсь получить дату, она снова конвертирует дату в формате UTC.Я хочу, чтобы дата сохранялась в.

Например, предположим, что Европа / Берлин - 2018-09-27 09:25:00, а время UTC - 2018-09-27 07:25:00 Затем, когда явставьте данные, тогда они сохранят дату и время как 2018-09-27 07:25:00, но когда я их получу, Instant снова конвертирует время в UTC, поэтому я получаю дату как 2018-09-27T05: 25: 00Z

2018-09-27 12:34:40.525 TRACE LAPTOP-A64OROCI---o.h.t.d.s.BasicExtractor                           : extracted value ([created_2_0_] : [TIMESTAMP]) - [2018-09-27T05:25:00Z]

Ниже свойства я добавил в application.properties

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false spring.jackson.time-zone = UTC

Я добавил следующие зависимости в свой pom.xml

<dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency> 

Ниже приведен класс моего приложения

@SpringBootApplication
// Spring application base class
@EntityScan(basePackageClasses = { WiseLabApiApplication.class, Jsr310JpaConverters.class })
// Specify global exception handler from base package
@ControllerAdvice(basePackageClasses = WiseLabApiApplication.class)
public class WiseLabApiApplication extends SpringBootServletInitializer {


/**
 * Set the UTC time zone
 */
@PostConstruct
void init() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}

/**
 * Override configure method for deployment war file
 */
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    return builder.sources(WiseLabApiApplication.class);
}

/**
 * Starting point of WiseLab Server
 * 
 * @param args
 */
public static void main(String[] args) {
    Environment environment = SpringApplication.run(WiseLabApiApplication.class, args).getEnvironment();
    String serverEnvironment = null;
    String[] activeProfiles = null;
    String serverPort = environment.getProperty("server.port");
    if (!Objects.isNull(environment)) {
        activeProfiles = environment.getActiveProfiles();
        if (activeProfiles.length != 0) {
            serverEnvironment = activeProfiles[0];
            logger.info(
                    "\n\n*****************Server Configuration************************************************************");
            logger.info("WiseLabAPI server started ");
            logger.info("Environment Mode => " + serverEnvironment.toUpperCase());
            logger.info("Server Port => " + serverPort);
            logger.info(
                    "\n\n*************************************************************************************************");
        }
    }
}

}

Ниже приведен мой класс AuditingConfig

@Configuration
@EnableMBeanExport(registration=RegistrationPolicy.IGNORE_EXISTING)
@EnableJpaAuditing
public class AuditingConfig {

    @Bean
    public AuditorAware<Long> auditorProvider() {
        return new SpringSecurityAuditAwareImpl();
    }
}

class SpringSecurityAuditAwareImpl implements AuditorAware<Long> {

    @Override
    public Optional<Long> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        if (authentication == null ||
                !authentication.isAuthenticated() ||
                authentication instanceof AnonymousAuthenticationToken) {
            return Optional.empty();
        }

        UserPrincipal userPrincipal = (UserPrincipal) authentication.getPrincipal();

        return Optional.ofNullable(userPrincipal.getId());
    }
}

Ниже приведен базовый класс аудита, и я расширил базовый класс аудита в моей модели

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = { "createdAt", "updatedAt" }, allowGetters = true)
public abstract class BaseEntity  {

    private static final long serialVersionUID = 6783352876165714983L;

    @CreatedDate
    @Column(name = "created_at")
    private Instant createdAt;

    @LastModifiedDate
    @Column(name = "updated_at")
    private Instant updatedAt;

    @Column(name = "deleted", columnDefinition = "boolean default false")
    private boolean deleted = false;


    public BaseEntity() {
    }

    public Instant getCreatedAt() {
        System.out.println("Date in getCreatedAt : ");
        System.out.println(createdAt);
        return createdAt;
    }


    public Instant getUpdatedAt() {
        return updatedAt;
    }

    public void setCreatedAt(Instant createdAt) {
        this.createdAt = createdAt;
    }

    public void setUpdatedAt(Instant updatedAt) {
        this.updatedAt = updatedAt;
    }

    public boolean isDeleted() {
        return deleted;
    }

    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }

}

Ниже приведен класс мастер-модели, в котором я расширил BaseEntity

@Entity
@Table(name = "admin_group_master")
@SQLDelete(sql = "UPDATE admin_group_master SET deleted = true WHERE id = ?")
@Loader(namedQuery = "findAdminGroupMasterById")
@NamedQuery(name = "findAdminGroupMasterById", query = "SELECT grp FROM AdminGroupMaster grp WHERE grp.id = ? AND grp.deleted = false")
@Where(clause = "deleted = false")
@DynamicUpdate
public class AdminGroupMaster extends BaseEntity {
    /**
     * 
     */
    private static final long serialVersionUID = -6667484763475502316L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;

    @NotBlank
    @Column(name = "name")
    private String name;

}

Ниже приведенКласс репозитория adminGroupMaster

@Repository
@Transactional(readOnly = true)
public interface AdminGroupMasterRepository extends JpaRepository<AdminGroupMaster, Long> {

List<AdminGroupMaster> findByCreateByCustomer(Customer customer);
}

Ниже приведен мой класс обслуживания

@Service
public class AdminGroupService {

    public BaseResponse<GroupListResponse> getAdminGroupDetails(UserPrincipal currentAdmin) throws CustomException {

    // Get all admin groups based on customer id
        List<AdminGroupMaster> adminGroupDetails = adminGroupMasterRepository
                .findByCreateByCustomer(currentAdmin.getCustomer());

                adminGroupDetails.stream().forEach((groupDetails) -> {
                    System.out.println("Created Date Time : ");
                    System.out.println( groupDetails.getCreatedAt());
                });
    }
}

Любая помощь оценивается.

Заранее спасибо.

1 Ответ

0 голосов
/ 01 февраля 2019

--- Убедитесь, что часовой пояс дб - UTC

  1. Проверьте свои application.properties, убедитесь, что вы добавили useLegacyDatetimeCode = false & serverTimezone = UTC на ваш MySQL URL.
jdbc:mysql://localhost:3306/dbname?useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC
Добавьте следующее в application.properties
spring.jpa.properties.hibernate.jdbc.time_zone = UTC

--- Убедитесь, что часовой пояс вашего сервера UTC

  1. необходимо следующее:
@PostConstruct
void init() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...