• DGS之Mutations


    Mutations(突变)

    DGS框架支持突变,其结构与数据提取器相同,使用@DgsData注解。下面是一个突变的简单例子。

    type Mutation {
        addRating(title: String, stars: Int):Rating
    }
    
    type Rating {
        avgStars: Float
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    @DgsComponent
    public class RatingMutation {
        @DgsData(parentType = "Mutation", field = "addRating")
        public Rating addRating(DataFetchingEnvironment dataFetchingEnvironment) {
            int stars = dataFetchingEnvironment.getArgument("stars");
    
            if(stars < 1) {
                throw new IllegalArgumentException("Stars must be 1-5");
            }
    
            String title = dataFetchingEnvironment.getArgument("title");
            System.out.println("Rated " + title + " with " + stars + " stars") ;
    
            return new Rating(stars);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    注意,上面的代码通过调用DataFetchingEnvironment.getArgument方法为Mutation检索输入数据,就像数据提取器为其参数所做的那样。

    Input Types

    在上面的例子中,输入是两个标准的标量类型。你也可以使用复杂的类型,你应该在你的模式中把这些定义为输入类型。输入类型几乎与GraphQL中的类型相同,但有一些额外的规则。

    根据GraphQL规范,输入类型应该总是以Map的形式传递给数据提取器。这意味着输入类型的DataFetchingEnvironment.getArgument是一个Map,而不是你可能有的Java/Kotlin表示。该框架有一个围绕这个问题的便利机制,这将在接下来讨论。让我们先看看一个直接使用DataFetchingEnvironment的例子。

    type Mutation {
        addRating(input: RatingInput):Rating
    }
    
    input RatingInput {
        title: String,
        stars: Int
    }
    
    type Rating {
        avgStars: Float
    }
    --------------------------------
      @DgsComponent
    public class RatingMutation {
        @DgsData(parentType = "Mutation", field = "addRating")
        public Rating addRating(DataFetchingEnvironment dataFetchingEnvironment) {
    
          //输入类型应该总是以Map的形式传递给数据提取器
            Map<String,Object> input = dataFetchingEnvironment.getArgument("input");
          //为Mutation检索输入数据
            RatingInput ratingInput = new ObjectMapper().convertValue(input, RatingInput.class);
    
            System.out.println("Rated " + ratingInput.getTitle() + " with " + ratingInput.getStars() + " stars") ;
    
            return new Rating(ratingInput.getStars());
        }
    }
    
    class RatingInput {
        private String title;
        private int stars;
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public int getStars() {
            return stars;
        }
    
        public void setStars(int stars) {
            this.stars = stars;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    image-20220711191521918

    作为数据获取器方法参数的输入参数

    该框架使获取输入参数变得更加容易。你可以指定参数作为数据获取器的方法参数。

    @DgsComponent
    public class RatingMutation {
        @DgsData(parentType = "Mutation", field = "addRating")
        public Rating addRating(@InputArgument("input") RatingInput ratingInput) {
            //No need for custom parsing anymore!
            System.out.println("Rated " + ratingInput.getTitle() + " with " + ratingInput.getStars() + " stars") ;
    
            return new Rating(ratingInput.getStars());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    @InputArgument注解对于指定输入参数的名称很重要,因为参数可以以任何顺序指定。如果没有注解,框架会尝试使用参数名称,但这只有在代码以特定的编译器设置进行编译时才能实现。输入类型参数可以与DataFetchingEnvironment参数相结合。

    @DgsComponent
    public class RatingMutation {
        @DgsData(parentType = "Mutation", field = "addRating")
        public Rating addRating(@InputArgument("input") RatingInput ratingInput, DataFetchingEnvironment dfe) {
            //No need for custom parsing anymore!
            System.out.println("Rated " + ratingInput.getTitle() + " with " + ratingInput.getStars() + " stars") ;
            System.out.println("DataFetchingEnvironment: " + dfe.getArgument(ratingInput));
    
            return new Rating(ratingInput.getStars());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    详解Lombok中的@Builder用法

    Java中lombok @Builder注解使用详解

    建造者模式

  • 相关阅读:
    栈进阶:ElasticSearch
    《六月集训》(第二十六天)——并查集
    我的个人网站不让接入微信登录,于是我做了这个
    PTA:数据结构实验 一 链队列
    文本提取IP并批量自动化情报查询工具——getIpInfo
    OpenCL编程指南-11.1OpenCL嵌入式简档
    scala(day01)
    linux服务器开发(定时器函数)alarm和slepp
    基于QTGUI的坦克大战游戏设计
    C++里sscanf()与swscanf()的使用
  • 原文地址:https://blog.csdn.net/qq_43430343/article/details/125916806