Java Aws lambda Spring多部分对象
我已经在Amazon中配置了所有的内容类型和二进制类型,以支持多部分/表单数据,但是它仍然不喜欢它,我认为spring已经启动了Jackson,它将映射对象。我看过一个视频,其中的人成功地通过发送多部分通过它,所以我相信我在这里遗漏了一些东西,请帮助 邮递员提供以下资料:Java Aws lambda Spring多部分对象,java,spring,amazon-web-services,amazon-s3,aws-lambda,Java,Spring,Amazon Web Services,Amazon S3,Aws Lambda,我已经在Amazon中配置了所有的内容类型和二进制类型,以支持多部分/表单数据,但是它仍然不喜欢它,我认为spring已经启动了Jackson,它将映射对象。我看过一个视频,其中的人成功地通过发送多部分通过它,所以我相信我在这里遗漏了一些东西,请帮助 邮递员提供以下资料: { "errorMessage": "An error occurred during JSON parsing", "errorType": &qu
{
"errorMessage": "An error occurred during JSON parsing",
"errorType": "java.lang.RuntimeException",
"stackTrace": [],
"cause": {
"errorMessage": "com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.web.multipart.MultipartFile` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information\n at [Source: (ByteArrayInputStream); line: 1, column: 1]",
"errorType": "java.io.UncheckedIOException",
"stackTrace": [
"com.amazonaws.services.lambda.runtime.serialization.factories.JacksonFactory$InternalSerializer.fromJson(JacksonFactory.java:184)"
],
"cause": {
"errorMessage": "Cannot construct instance of `org.springframework.web.multipart.MultipartFile` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information\n at [Source: (ByteArrayInputStream); line: 1, column: 1]",
"errorType": "com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.exc.InvalidDefinitionException",
"stackTrace": [
"com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)",
"com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1589)",
"com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1055)",
"com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:265)",
"com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1719)",
"com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1228)",
"com.amazonaws.services.lambda.runtime.serialization.factories.JacksonFactory$InternalSerializer.fromJson(JacksonFactory.java:182)"
]
}
兰姆达
@Component
public class Hello implements Function<MultipartFile, String> {
@Autowired
private AmazonClient amazonClient;
@Override
public String apply(@RequestPart MultipartFile multipartFile) {
return amazonClient.uploadFile(multipartFile);
}
}
@Service
public class AmazonClient {
@Autowired
private final AmazonS3 s3client;
@Value("${amazonProperties.endpointUrl}")
private String endpointUrl;
@Value("${amazonProperties.bucketName}")
private String bucketName;
@Value("${amazonProperties.accessKey}")
private String accessKey;
@Value("${amazonProperties.secretKey}")
private String secretKey;
public AmazonClient() {
BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey,secretKey);
this.s3client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_2)
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.build();;
}
public String uploadFile(MultipartFile multipartFile) {
String fileUrl;
try {
File file = convertMultiPartToFile(multipartFile);
String fileName = generateFileName(multipartFile);
fileUrl = endpointUrl + "/" + bucketName + "/" + fileName;
uploadFileTos3bucket(fileName, file);
} catch (Exception e) {
throw new RuntimeException(e);
}
return fileUrl;
}
private File convertMultiPartToFile(MultipartFile file){
File convFile = new File(Objects.requireNonNull(file.getOriginalFilename()));
try {
FileOutputStream fos = new FileOutputStream(convFile);
fos.write(file.getBytes());
fos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
return convFile;
}
private String generateFileName(MultipartFile multiPart) {
return new Date().getTime() + "-" + Objects.requireNonNull(multiPart.getOriginalFilename()).replace(" ", "_");
}
public void uploadFileTos3bucket(String fileName, File file) {
s3client.putObject(new PutObjectRequest(bucketName, fileName, file)
.withCannedAcl(CannedAccessControlList.PublicRead));
}
}