我试图发送一个JSON格式的带有图片附件和员工详细信息的发布请求。对于ImageData和Employee,我有不同的表。我可以用我的代码存储图片数据,但不能存储员工数据。显示错误消息“无法提交JPA事务”。这里我分享我的代码详细信息
#Post Request
@PostMapping("/create")
public Employee tempCreateEmployee(
@RequestParam("json") String json,
@RequestParam("file") MultipartFile file
) throws CustomException {
try {
ObjectMapper objectMapper = new ObjectMapper();
logger.info("data received as string");
Employee employee = objectMapper.readValue(json, Employee.class);
logger.info(employee.toString());
logger.info("Received employee data: {}", employee);
int imageId=fileService.uploadImageFile(file);
logger.info("file processing successful");
employee.setImageid(imageId);
logger.info(employee.toString());
return employeeService.save(employee);
} catch (Exception ex) {
throw new CustomException("Employee object not created");
}
}
字符串
一种上传图片的服务方法
public int uploadImageFile(MultipartFile file) throws IOException {
ImageData imageData= filesRepo.save(ImageData.builder()
.name(file.getOriginalFilename())
.type(file.getContentType())
.id(filesRepo.findAll().size()+1)
.image_filedata(ImageUtils.compressImage(file.getBytes())).build());
return imageData.getId();
}
型
员工模型类:
package com.SpringTask.SpringTask.Models;
import com.SpringTask.SpringTask.Encryption.Encrypt;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.persistence.*;
import jakarta.validation.constraints.*;
import jdk.jfr.DataAmount;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import lombok.*;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Setter
@Getter
@Data
@Entity
@Table(name="tableEmployees")
public class Employee {
@Id
@GeneratedValue
public Integer id;
public String firstName;
public String lastName;
public String address;
public String email;
public int phoneNumber;
private int imageid;
}
型
ImageData模型类:
package com.SpringTask.SpringTask.Models;
import jakarta.persistence.*;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.*;
import lombok.NoArgsConstructor;
import org.hibernate.engine.internal.Cascade;
import java.util.Arrays;
@Entity
@Table(name = "tableImageData")
@Builder(toBuilder = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
public class ImageData {
@Id
private int id;
private String name;
private String type;
@Lob
@Column(name = "image_filedata", columnDefinition = "LONGBLOB")
private byte[] image_filedata;
}
型
的数据
我试过调试,但每次都出现同样的问题。我已经验证了我的数据库设置和代码逻辑。无法提交JPA事务意味着什么?
2条答案
按热度按时间uurv41yg1#
enter image description here
当在Postman中发送请求时,您可以尝试通过Body中的raw和json模型发送数据。
gblwokeq2#
您需要共享JSON数据和
EmployeeService
类以更好地理解问题。从你分享的图片中,我发现了一个问题:
你给予
id
来创建一个雇员,但是在Employee
模型中,它是由Hibernate通过指定@GeneratedValue
在你的模型中自动生成的。所以这是错误的,你不应该在你的JSON数据中添加id字段。这可能是得到错误的原因。如果你想在外部给予
id
,那么你需要删除Employee
类中的@GeneratedValue
注解。