【问题标题】:I can't upload files with graphql-java我无法使用 graphql-java 上传文件
【发布时间】:2020-03-09 19:37:29
【问题描述】:

我尝试使用 java graphql 上传文件。我查看了该主题的解决方案:How to upload files with graphql-java? 我正在使用 graphql-java 11.0 版、graphql-spring-boot-starter 5.0.2 版、graphql-java-kickstart 7.5.0 版。

public class PartDeserializer extends JsonDeserializer {

  @Override
  public Part deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {

    return null;
  }

  @Bean
  public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    SimpleModule module = new SimpleModule();
    module.addDeserializer(Part.class, new PartDeserializer());
    objectMapper.registerModule(module);
    return objectMapper;
  }
}
@Configuration
public class GraphqlConfig {

  @Bean
  public GraphQLScalarType uploadScalarDefine() {
    return ApolloScalars.Upload;
  }
}
public Boolean testMultiFilesUpload(List<Part> parts, DataFetchingEnvironment env) {
        // get file parts from DataFetchingEnvironment, the parts parameter is not use
        List<Part> attachmentParts = env.getArgument("files");
        int i = 1;
        for (Part part : attachmentParts) {
            String uploadName = "copy" + i;
            try {
                part.write("your path:" + uploadName);
            } catch (IOException e) {
                e.printStackTrace();
            }
            i++;
        }
        return true;
    }
scalar Upload
testMultiFilesUpload(files: [Upload!]!): Boolean

我在 Postman 中的数据查询是这样的

operations
{ "query": "mutation($files: [Upload!]!) {testMultiFilesUpload(files:$files)}", "variables": {"files": [null,null] } }

map
{ "file0": ["variables.files.0"] , "file1":["variables.files.1"]}

file0
0.jpeg
file1
1.jpeg

这是服务器响应

INFO 11663 --- [0.1-1100-exec-7] g.servlet.AbstractGraphQLHttpServlet     : Bad POST multipart request: no part named "graphql" or "query"

我做错了什么?

【问题讨论】:

  • 你的graphql-java版本是11.0,不支持文件上传

标签: java graphql postman


【解决方案1】:

你可以试试这个依赖:

<properties>
        <graphql-java.version>13.0</graphql-java.version>
        <graphql-java-kickstart-springboot.version>5.10.0</graphql-java-kickstart-springboot.version>
        <graphql-java-kickstart-tools.version>5.6.1</graphql-java-kickstart-tools.version>
        <graphql-java-kickstart-servlet.version>8.0.0</graphql-java-kickstart-servlet.version>
</properties>

 <dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphql-spring-boot-starter</artifactId>
    <version>5.9.0</version>
 </dependency>
 <dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphql-java-tools</artifactId>
    <version>5.6.1</version>
 </dependency>
 <dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphiql-spring-boot-starter</artifactId>
    <version>5.6.0</version>
 </dependency>

但是graphql文件上传有问题,我们不能删除graphql生成的临时文件,因为它一直被graphql使用,文件流没有关闭。

【讨论】:

  • 感谢您的回答。我还有另一个问题。当我尝试通过邮递员发送文件时。我收到这样一条消息:~~~“消息”:“获取数据时出现异常(/testMultiFilesUpload):没有为类 java.io.FileDescriptor 找到序列化程序,也没有发现创建 BeanSerializer 的属性(为避免异常,请禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS) (通过引用链:java.util.ArrayList[0]->org.apache.catalina.core.ApplicationPart[\"inputStream\"]->java.io.FileInputStream[\"fd\"])" ~~~那是怎么回事?它在 PartDeserializer.class 中被禁用
  • objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);此代码应避免 FAIL_ON_EMPTY_BEANS 异常,但看起来不起作用。
  • 对不起我的错误我忘记了注解@Component。如何更改保存路径?
  • “保存路径”你的意思是你的存储路径?你需要处理文件流,这个是你的选择,我帮不了你
【解决方案2】:

我建议你使用 Apollo https://github.com/apollographql/apollo-android

它使用 RxJava 集成、改造、订阅和对 AutoValue 的支持。这将使您的工作更轻松,因为没有直接的方法可以为 GraphQL 构建查询和解析响应。

【讨论】:

  • 感谢您的建议。请告诉我,我可以在没有 gradle 的情况下使用 apollo 吗?我目前正在使用 Maven。我看到 Apollo 需要发送文件,我必须在 build.gradle 文件中定义这个映射。我如何在 Maven 项目中做到这一点?
  • 是的,你可以在没有 gradle 的情况下使用 apollographql 客户端。看看这个答案stackoverflow.com/a/56266319/4564200
猜你喜欢
  • 2019-06-30
  • 2019-12-13
  • 2021-05-18
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多