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 之前创建时间戳。
我的域实体代码:
@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 之前创建时间戳。