POST 创建返回的 createdAt 为 null

POST create returning createdAt as null

我的域实体代码:

@Cacheable
@Entity
@Table(name = "core_application")
public class Application extends PanacheEntityBase {

    // ...

    @Column(name = "created_at", updatable = false)
    @CreationTimestamp
    public LocalDateTime createdAt;

}

我的数据传输对象 (DTO) 代码:

public class ApplicationDTO {

  // ...

  private LocalDateTime createdAt;

  // ...

  public LocalDateTime getCreatedAt() {
      return this.createdAt;
  }

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

  public ApplicationDTO(/** ..., */LocalDateTime createdAt) {
      // ...

      this.createdAt = createdAt;
  }

}

我的资源端点代码:

@Path("/responses")
@ApplicationScoped
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class ResponsesResource {

    final static int HTTP_UNPROCESSABLE_ENTITY = 422;

    @Inject
    ApplicationService applicationService;

    @GET
    @Path("{id}")
    public ApplicationDTO getApplication(@PathParam(value = "id") UUID id) {
        ApplicationDTO entity = applicationService.getApplication(id);

        if (entity == null) {
            throw new WebApplicationException("Application with id of " + id + " does not exist.", Response.Status.NOT_FOUND);
        }

        return entity;
    }

    @POST
    @Transactional
    public Response create(ApplicationDTO applicationDTO) {
        if (applicationDTO.getId() != null) {
            throw new WebApplicationException("Id was invalidly set on request.", HTTP_UNPROCESSABLE_ENTITY);
        }

        ApplicationDTO entity = applicationService.save(applicationDTO);

        return Response.ok(entity).status(Response.Status.CREATED).build();
    }

}

申请服务代码

@ApplicationScoped
public class ApplicationService {

    @Inject
    ApplicationMapper applicationMapper;

    public ApplicationDTO getApplication(UUID id) {
        return applicationMapper.toDto(Application.findById(id));
    }

    public List<ApplicationDTO> getAll() {
        Stream<Application> entities = Application.streamAll();

        return entities.map(entity -> applicationMapper.toDto(entity))
            .collect(Collectors.toList());
    }

    public ApplicationDTO save(ApplicationDTO applicationDTO) {
        Application entity = applicationMapper.toEntity(applicationDTO);

        entity.persist();

        return applicationMapper.toDto(entity);
    }

}

提交POST请求时,createdAt为return as null:

但是如果我 运行 GET 请求,createdAt 是 return 正确:

我哪里错了?

在您的 post 方法中为时间戳创建对象。

我以前也遇到过这种问题。同时将创建更改为时间(temporaltype.timestamp)。

  @RequestMapping(value = "/add", produces = "application/json", method = { RequestMethod.POST })
    public ResponseEntity<ConfigImpact> addImpact(@RequestBody ConfigImpact impact) {
        Date mUpdatedDate = new Date();
        impact.setIsActive(true);
        impact.setLastModifiedTime(mUpdatedDate);
        impact.setModifiedUserID(1000);
        repository.save(impact);

        return new ResponseEntity<>(impact, HttpStatus.CREATED);
    }

在将实体插入数据库时​​分配 @CreationTimestamp 值。

在您的情况下,这发生在交易结束时。 由于您的 @Transactional 注释位于您的控制器方法中,因此您可以在事务提交之前创建 DTO,并且时间戳仍为 null.

您可能会考虑将 @Transactional 注释移动到您的服务方法,或使用 entity.persistAndFlush() 触发立即插入,以便在您创建 DTO 之前创建时间戳。