Spring boot 的嵌入式 Tomcat 默认支持 Servlet 3.x 多部分。 GraphQL java servlet 支持公共文件上传。为了使事情正常工作,你必须禁用 Spring boot 默认的多部分配置,例如:
在pom.xml中添加commons-fileupload的maven依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
应用程序.yml
spring:
servlet:
multipart:
enabled: false
Spring Boot应用程序类
@EnableAutoConfiguration(exclude={MultipartAutoConfiguration.class})
并在你的@Configuration中添加一个@Bean
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(100000);
return multipartResolver;
}
现在您可以在 GraphQL 上下文中找到上传的多部分文件,因为它们会自动映射到:
environment -> context -> files
可从数据获取环境
以及突变的实现示例:
@Component
public class Mutation implements GraphQLMutationResolver {
@Autowired
private TokenService tokenService;
@Autowired
private UserRepository userRepository;
@Autowired
private UserService userService;
@Autowired
private ProjectRepository repository;
@Autowired
@Qualifier( value = "modeshape" )
private StorageService storageService;
@GraphQLField @GraphQLRelayMutation
public ProjectItem createProject( CreateProjectInput input, DataFetchingEnvironment environment ) {
Project project = new Project( input.getName() );
project.setDescription( input.getDescription() );
GraphQLContext context = environment.getContext();
Optional<Map<String, List<FileItem>>> files = context.getFiles();
files.ifPresent( keys -> {
List<FileItem> file = keys.get( "file" );
List<StorageService.FileInfo> storedFiles = file.stream().map( f -> storageService.store( f, "files", true ) ).collect( Collectors.toList() );
project.setFile( storedFiles.get( 0 ).getUuid() );
} );
repository.save( project );
return new ProjectItem( project );
}
class CreateProjectInput {
private String name;
private String description;
private String clientMutationId;
@GraphQLField
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public void setDescription( String description ) {
this.description = description;
}
@GraphQLField
public String getClientMutationId() {
return clientMutationId;
}
}