{"id":47865,"date":"2023-03-16T01:39:23","date_gmt":"2023-06-10T02:03:03","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/"},"modified":"2024-04-29T19:04:50","modified_gmt":"2024-04-29T11:04:50","slug":"%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/","title":{"rendered":"\u4f7f\u7528Spring for GraphQL\u6784\u5efaGraphQL API\u7684\u6b65\u9aa4"},"content":{"rendered":"<h1>Spring for GraphQL\u662f\u4e00\u4e2a\u7528\u4e8e\u6784\u5efaGraphQL API\u7684Spring\u6846\u67b6\u3002<\/h1>\n<p>\u4e00\u822c\u6765\u8bf4\uff0c\u6784\u5efaJava\u7684GraphQL API\u901a\u5e38\u4f7f\u7528GraphQL Java\u3002<br \/>\n\u5982\u679c\u4f7f\u7528SpringBoot\uff0c\u4e5f\u662f\u7c7b\u4f3c\u7684\u60c5\u51b5\uff0c\u4f46\u662f\u57282022\u5e745\u6708\uff0cSpring for Java\u53d1\u5e03\u4e861.0.0\u7248\uff0c\u5e76\u5b98\u65b9\u63d0\u4f9b\u4e86\u5bf9GraphQL\u7684\u652f\u6301\u3002<br \/>\n\u56e0\u4e3a\u53d1\u5e03\u65f6\u95f4\u8fd8\u4e0d\u4e45\uff0c\u6240\u4ee5\u622a\u81f32022\u5e747\u6708\uff0cSpring for GraphQL\u7684\u5b98\u65b9\u6587\u6863\u548c\u793a\u4f8b\u5185\u5bb9\u8fd8\u4e0d\u662f\u5f88\u4e30\u5bcc\u3002<\/p>\n<p>\u8fd9\u6b21\u6211\u4eec\u5c06\u53c2\u8003\u6837\u4f8b\u548c\u6587\u6863\uff0c\u72ec\u81ea\u5730\u4f7f\u7528Spring for GraphQL\u6765\u5b9e\u73b0API\u7684\u5b9e\u65bd\u3002<\/p>\n<p>&nbsp;<\/p>\n<h1>\u8fd9\u6b21\u8981\u5b9e\u65bd\u7684API\u6570\u636e\u6a21\u578b<\/h1>\n<p>\u5c06\u5b58\u50a8\u5728\u6570\u636e\u5e93\u4e2d\u7684\u4ee5\u4e0b\u8868\u91cd\u65b0\u5b9a\u4e49\u4e3aGraphQL\u6a21\u5f0f\uff0c\u5e76\u5b9e\u73b0\u80fd\u591f\u83b7\u53d6\u7075\u6d3b\u6570\u636e\u7684API\u3002<br \/>\n\u9996\u5148\uff0c\u6211\u4eec\u5c06\u6839\u636e\u4e0b\u56fe\u7684\u6570\u636e\u6a21\u578b\u8fdb\u884cGraphQL\u6a21\u5f0f\u5b9a\u4e49\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8187913a08637a6ad6d3\/6-0.png\" alt=\"er.png\" \/><\/div>\n<p>\u4ee5\u4e0b\u662f\u5404\u4e2a\u8868\u7684\u4f7f\u7528\u76ee\u7684\u3002<br \/>\n\u53e6\u5916\uff0c\u7531\u4e8e\u662f\u968f\u610f\u521b\u5efa\u7684\uff0c\u53ef\u80fd\u6ca1\u6709\u5b8c\u5168\u8fdb\u884c\u89c4\u8303\u5316\uff0c\u8bf7\u4e0d\u8981\u592a\u5728\u610f\u8fd9\u4e00\u70b9\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Account\u30c6\u30fc\u30d6\u30eb\uff1a\u30e6\u30fc\u30b6\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u60c5\u5831\u3092\u7ba1\u7406\u3057\u307e\u3059\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Service_Group\u30c6\u30fc\u30d6\u30eb\uff1a\u30e6\u30fc\u30b6\u304c\u6240\u5c5e\u3059\u308b\u30b5\u30fc\u30d3\u30b9\u30b0\u30eb\u30fc\u30d7\u3092\u7ba1\u7406\u3057\u3001\u30b5\u30fc\u30d3\u30b9\u30b0\u30eb\u30fc\u30d7\u306f\u8907\u6570\u306e\u30c1\u30fc\u30e0\u3092\u6301\u3061\u307e\u3059\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Team\u30c6\u30fc\u30d6\u30eb\uff1a\u30e6\u30fc\u30b6\u304c\u6240\u5c5e\u3059\u308b\u30c1\u30fc\u30e0\u3092\u7ba1\u7406\u3057\u307e\u3059\u3002<\/ul>\n<h1>\u521b\u5efa\u7a7a\u767d\u9879\u76ee<\/h1>\n<p>\u9996\u5148\uff0c\u5728Spring Initializr\u4e0a\u521b\u5efa\u4e00\u4e2a\u7a7a\u767d\u9879\u76ee\uff0c\u5e76\u521b\u5efa\u6240\u9700\u7684\u5305\u548c\u76ee\u5f55\u3002<br \/>\n\u4f7f\u7528\u7684\u6784\u5efa\u5de5\u5177\u3001JDK\u3001SpringBoot\u548c\u4f9d\u8d56\u5e93\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<div>\n<div class=\"post-table\">FW\/\u30e9\u30a4\u30d6\u30e9\u30ea\u7b49\u30d0\u30fc\u30b8\u30e7\u30f3AdoptOpenJDK11SpringBoot2.7.1Maven3.5.4Spring Web-Spring for GraphQL-Lombok-H2 Database-log4j2-<\/div>\n<\/div>\n<p>\u5728Spring Initializr\u4e2d\u65e0\u6cd5\u6307\u5b9aLog4j2\uff0c\u56e0\u6b64\u9700\u8981\u76f4\u63a5\u5728pom.xml\u4e2d\u6dfb\u52a0\u4f9d\u8d56\u9879\u3002\u4e3a\u4e86\u6392\u9664spring-boot-starter\u4f9d\u8d56\u7684\u65e5\u5fd7\u5e93\uff0c\u9700\u8981\u4f7f\u7528\u8fdb\u884c\u6392\u9664\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nt\">&lt;dependency&gt;<\/span>\r\n  <span class=\"nt\">&lt;groupId&gt;<\/span>org.springframework.boot<span class=\"nt\">&lt;\/groupId&gt;<\/span>\r\n    <span class=\"nt\">&lt;artifactId&gt;<\/span>spring-boot-starter<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\r\n    <span class=\"nt\">&lt;exclusions&gt;<\/span>\r\n      <span class=\"nt\">&lt;exclusion&gt;<\/span>\r\n        <span class=\"nt\">&lt;groupId&gt;<\/span>org.springframework.boot<span class=\"nt\">&lt;\/groupId&gt;<\/span>\r\n        <span class=\"nt\">&lt;artifactId&gt;<\/span>spring-boot-starter-logging<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\r\n      <span class=\"nt\">&lt;\/exclusion&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/exclusions&gt;<\/span>\r\n<span class=\"nt\">&lt;\/dependency&gt;<\/span>\r\n<span class=\"nt\">&lt;dependency&gt;<\/span>\r\n  <span class=\"nt\">&lt;groupId&gt;<\/span>org.springframework.boot<span class=\"nt\">&lt;\/groupId&gt;<\/span>\r\n  <span class=\"nt\">&lt;artifactId&gt;<\/span>spring-boot-starter-log4j2<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\r\n<span class=\"nt\">&lt;\/dependency&gt;<\/span>\r\n\r\n<\/code><\/pre>\n<h1>\u6837\u672c\u5e94\u7528\u7a0b\u5e8f\u7684\u6784\u5efa<\/h1>\n<p>\u9879\u76ee\u7ed3\u6784\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre class=\"post-pre\"><code>spring-graphql-sample\r\n \u251c src\r\n \u2502  \u251c main\r\n \u2502  \u2502  \u251c java\/com.spring.graphql.example \r\n \u2502  \u2502  \u2502  \u251c controller\r\n \u2502  \u2502  \u2502  \u251c entity\r\n \u2502  \u2502  \u2502  \u251c repository\r\n \u2502  \u2502  \u2502  \u2514 Main.java \r\n \u2502  \u2502  \u2502\r\n \u2502  \u2502  \u2514 respurces\r\n \u2502  \u2502     \u251c graphql\r\n \u2502  \u2502     \u2502  \u2514 graphql-schema.graphqls --- graphqls\u30d5\u30a1\u30a4\u30eb\r\n \u2502  \u2502     \u251c aplication.yaml\r\n \u2502  \u2502     \u251c log4j2.xml --- \u30ed\u30b0\u51fa\u529b\u8a2d\u5b9a\r\n \u2502  \u2502     \u251c schema.sql --- H2 DB\u30c6\u30fc\u30d6\u30eb\u521d\u671f\u5316\u30b9\u30af\u30ea\u30d7\u30c8\r\n \u2502  \u2502     \u2514 data.sql  --- H2 DB\u30c7\u30fc\u30bf\u521d\u671f\u5316\u30b9\u30af\u30ea\u30d7\u30c8\r\n \u2502  \u2502\r\n \u2502  \u2514 test --- \u30c6\u30b9\u30c8\u7528(\u4eca\u56de\u4f7f\u7528\u305b\u305a)\r\n \u2514 pom.xml\r\n<\/code><\/pre>\n<h1>\u51c6\u5907\u5b9e\u65bd<\/h1>\n<p>\u5728\u5f00\u59cb\u5b9e\u73b0GraphQL API\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u5728\u9879\u76ee\u4e2d\u914d\u7f6e\u5c06\u6570\u636e\u548c\u65e5\u5fd7\u53d1\u9001\u5230\u6570\u636e\u5e93\u3002<\/p>\n<h2>\u51c6\u5907\u4efb\u52a11: \u8868\u5b9a\u4e49\u548c\u6570\u636e\u5e93\u8fde\u63a5\u5b9a\u4e49\u8bbe\u7f6e<\/h2>\n<p>\u56e0\u4e3a\u5206\u522b\u8bbe\u7f6eDBMS\u4f1a\u5f88\u9ebb\u70e6\uff0c\u6240\u4ee5\u6211\u4eec\u4f7f\u7528H2DB\u3002<br \/>\n\u4e3a\u4e86\u5728\u5e94\u7528\u542f\u52a8\u65f6\u81ea\u52a8\u5c06\u8868\u548c\u6570\u636e\u6d41\u5165H2DB\uff0c\u6211\u4eec\u5c06\u4ee5\u4e0b\u5185\u5bb9\u4fdd\u5b58\u5230schema.sql\u4e2d\u3002<br \/>\n\uff08\u7701\u7565data.sql\u7684\u5185\u5bb9\uff0c\u8bf7\u81ea\u884c\u8bbe\u7f6e\u9002\u5f53\u7684\u6570\u636e\u3002\uff09<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">-- Service Group<\/span>\r\n<span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"n\">service_group<\/span> <span class=\"p\">(<\/span>\r\n  <span class=\"n\">service_group_id<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span> <span class=\"k\">COMMENT<\/span> <span class=\"s1\">'\u30b5\u30fc\u30d3\u30b9\u30b0\u30eb\u30fc\u30d7ID'<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"n\">service_group_name<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">40<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">COMMENT<\/span> <span class=\"s1\">'\u30b5\u30fc\u30d3\u30b9\u30b0\u30eb\u30fc\u30d7\u540d'<\/span>\r\n<span class=\"p\">);<\/span>\r\n<span class=\"c1\">-- Team<\/span>\r\n<span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"n\">team<\/span> <span class=\"p\">(<\/span>\r\n  <span class=\"n\">team_id<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span> <span class=\"k\">COMMENT<\/span> <span class=\"s1\">'\u30c1\u30fc\u30e0ID'<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"n\">belonging_service_group_id<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">COMMENT<\/span> <span class=\"s1\">'\u6240\u5c5e\u30b5\u30fc\u30d3\u30b9\u30b0\u30eb\u30fc\u30d7\u30b0ID'<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"n\">team_name<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">40<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">COMMENT<\/span> <span class=\"s1\">'\u30c1\u30fc\u30e0\u540d'<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"n\">team_authority<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">15<\/span><span class=\"p\">)<\/span> <span class=\"k\">COMMENT<\/span> <span class=\"s1\">'\u30c1\u30fc\u30e0\u6a29\u9650'<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"k\">FOREIGN<\/span> <span class=\"k\">KEY<\/span> <span class=\"p\">(<\/span><span class=\"n\">belonging_service_group_id<\/span><span class=\"p\">)<\/span> <span class=\"k\">REFERENCES<\/span> <span class=\"n\">service_group<\/span> <span class=\"p\">(<\/span><span class=\"n\">service_group_id<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">);<\/span>\r\n<span class=\"c1\">-- Account Table<\/span>\r\n<span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"n\">account<\/span> <span class=\"p\">(<\/span>\r\n  <span class=\"n\">account_id<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span> <span class=\"k\">COMMENT<\/span> <span class=\"s1\">'\u30a2\u30ab\u30a6\u30f3\u30c8ID'<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"n\">user_name<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">40<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">COMMENT<\/span> <span class=\"s1\">'\u30e6\u30fc\u30b6\u540d'<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"n\">age<\/span> <span class=\"nb\">Int<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">COMMENT<\/span> <span class=\"s1\">'\u5e74\u9f62'<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"n\">account_type<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">COMMENT<\/span> <span class=\"s1\">'\u30a2\u30ab\u30a6\u30f3\u30c8\u5206\u985e'<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"n\">belonging_service_group_id<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">COMMENT<\/span> <span class=\"s1\">'\u6240\u5c5e\u30b5\u30fc\u30d3\u30b9\u30b0\u30eb\u30fc\u30d7ID'<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"n\">belonging_team_id<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">COMMENT<\/span> <span class=\"s1\">'\u6240\u5c5e\u30c1\u30fc\u30e0ID'<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"k\">FOREIGN<\/span> <span class=\"k\">KEY<\/span> <span class=\"p\">(<\/span><span class=\"n\">belonging_service_group_id<\/span><span class=\"p\">)<\/span> <span class=\"k\">REFERENCES<\/span> <span class=\"n\">service_group<\/span> <span class=\"p\">(<\/span><span class=\"n\">service_group_id<\/span><span class=\"p\">),<\/span>\r\n  <span class=\"k\">FOREIGN<\/span> <span class=\"k\">KEY<\/span> <span class=\"p\">(<\/span><span class=\"n\">belonging_team_id<\/span><span class=\"p\">)<\/span> <span class=\"k\">REFERENCES<\/span> <span class=\"n\">team<\/span> <span class=\"p\">(<\/span><span class=\"n\">team_id<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">);<\/span>\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u53ef\u4ee5\u5728application.yaml\u6587\u4ef6\u4e2d\u914d\u7f6e\u6570\u636e\u5e93\u8fde\u63a5\u5b9a\u4e49\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">spring<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">datasource<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">platform<\/span><span class=\"pi\">:<\/span> <span class=\"s\">h2<\/span>\r\n    <span class=\"na\">driver-class-name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">org.h2.Driver<\/span>\r\n    <span class=\"na\">url<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jdbc:h2:mem:testdb;DB_CLOSE_DELAY=1;DB_CLOSE_ON_EXIT=FALSE;MODE=DB2<\/span>\r\n    <span class=\"na\">username<\/span><span class=\"pi\">:<\/span> <span class=\"s\">sa<\/span>\r\n    <span class=\"na\">password<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">'<\/span>\r\n<\/code><\/pre>\n<h2>\u5907\u5fd8\u5f552\uff1a\u65e5\u5fd7\u914d\u7f6e<\/h2>\n<p>\u6211\u4eec\u5c06\u4f7f\u7528log4j2\u8fdb\u884c\u65e5\u5fd7\u8bb0\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;Configuration<\/span> <span class=\"na\">status=<\/span><span class=\"s\">\"error\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;Properties&gt;<\/span>\r\n        <span class=\"nt\">&lt;Property<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"format1\"<\/span><span class=\"nt\">&gt;<\/span>[%d{yyyy\/MM\/dd HH:mm:ss.SSS}] [%t] [%-6p] [%c{10}] : %m%n<span class=\"nt\">&lt;\/Property&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/Properties&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;Appenders&gt;<\/span>\r\n        <span class=\"nt\">&lt;Console<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"Console\"<\/span> <span class=\"na\">target=<\/span><span class=\"s\">\"SYSTEM_OUT\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;PatternLayout&gt;<\/span>\r\n                <span class=\"nt\">&lt;pattern&gt;<\/span>${format1}<span class=\"nt\">&lt;\/pattern&gt;<\/span>\r\n            <span class=\"nt\">&lt;\/PatternLayout&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/Console&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/Appenders&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;Loggers&gt;<\/span>\r\n        <span class=\"nt\">&lt;Root<\/span> <span class=\"na\">level=<\/span><span class=\"s\">\"info\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;AppenderRef<\/span> <span class=\"na\">ref=<\/span><span class=\"s\">\"Console\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/Root&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/Loggers&gt;<\/span>\r\n<span class=\"nt\">&lt;\/Configuration&gt;<\/span>\r\n<\/code><\/pre>\n<h1>GraphQLAPI\u7684\u5b9e\u73b0<\/h1>\n<p>\u7531\u4e8e\u4e8b\u524d\u51c6\u5907\u5de5\u4f5c\u5df2\u7ecf\u5b8c\u6210\uff0c\u6211\u4eec\u5c06\u5f00\u59cb\u5b9e\u73b0\u4e3b\u9898\u7684GraphQL API\u3002<\/p>\n<h2>\u7b2c\u4e00\u6b65\uff1aGraphQL\u7684Schema\u5b9a\u4e49<\/h2>\n<p>\u5728resources\/graphql\/\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u540d\u4e3agraphql-schema.graphqls\u7684\u6587\u4ef6\uff0c\u5e76\u5b9a\u4e49GraphQL\u7684\u6a21\u5f0f\u548c\u67e5\u8be2\u3002<br \/>\n\u8fd9\u6b21\u6211\u4eec\u5b9a\u4e49\u4e00\u4e2a\u540d\u4e3aaccountById\u7684\u67e5\u8be2\u3002<\/p>\n<p>\u901a\u8fc7\u5c06\u8d26\u6237ID\u4f5c\u4e3a\u53c2\u6570\u53d1\u9001API\u8bf7\u6c42\uff0c\u53ef\u4ee5\u83b7\u53d6\u4e0e\u8be5\u8d26\u6237ID\u76f8\u5173\u8054\u7684\u8d26\u6237\u4fe1\u606f\u3001\u6240\u5c5e\u7684\u670d\u52a1\u7ec4\u4fe1\u606f\u548c\u56e2\u961f\u4fe1\u606f\u3002<br \/>\n\u6b64\u5916\uff0c\u867d\u7136\u610f\u4e49\u4e0d\u5927\uff0c\u4f46\u4e5f\u53ef\u4ee5\u4ece\u83b7\u53d6\u7684\u56e2\u961f\u4fe1\u606f\u4e2d\u83b7\u53d6\u6240\u5c5e\u7684\u670d\u52a1\u7ec4\u4fe1\u606f\u3002<\/p>\n<p>\u5728GraphQL\u4e2d\uff0c\u63a8\u8350\u4f7f\u7528\u4e00\u79cd\u66f4\u6613\u4e8e\u6570\u636e\u4f7f\u7528\u8005\u4f7f\u7528\u7684\u5f62\u5f0f\u6765\u5b9a\u4e49\u6a21\u5f0f\uff0c\u4e0e\u6570\u636e\u5e93\u7684\u8868\u5b9a\u4e49\u4e0d\u540c\u3002\u5173\u4e8e\u6a21\u5f0f\u5b9a\u4e49\u7684\u89c4\u5219\u548c\u601d\u8003\u65b9\u5f0f\uff0c\u8bf7\u53c2\u8003\u6b64\u94fe\u63a5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># \u30af\u30a8\u30ea\u5b9a\u7fa9<\/span>\r\n<span class=\"k\">type<\/span> <span class=\"n\">Query<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">accountById<\/span><span class=\"p\">(<\/span><span class=\"n\">accountId<\/span><span class=\"p\">:<\/span> <span class=\"nb\">ID<\/span><span class=\"p\">):<\/span> <span class=\"n\">Account<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"c\"># \u30bf\u30a4\u30d7\u5b9a\u7fa9<\/span>\r\n<span class=\"k\">type<\/span> <span class=\"n\">ServiceGroup<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">serviceGroupId<\/span><span class=\"p\">:<\/span> <span class=\"nb\">ID<\/span><span class=\"p\">!<\/span>\r\n    <span class=\"n\">serviceGroupName<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span>\r\n    <span class=\"n\">teams<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"n\">Team<\/span><span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">type<\/span> <span class=\"n\">Team<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">teamId<\/span><span class=\"p\">:<\/span> <span class=\"nb\">ID<\/span><span class=\"p\">!<\/span>\r\n    <span class=\"n\">teamName<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span>\r\n    <span class=\"n\">teamAuthority<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span>\r\n    <span class=\"n\">serviceGroup<\/span><span class=\"p\">:<\/span> <span class=\"n\">ServiceGroup<\/span><span class=\"p\">!<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">type<\/span> <span class=\"n\">Account<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">accountId<\/span><span class=\"p\">:<\/span> <span class=\"nb\">ID<\/span><span class=\"p\">!<\/span>\r\n    <span class=\"n\">userName<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span>\r\n    <span class=\"n\">age<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Int<\/span>\r\n    <span class=\"n\">accountType<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span>\r\n    <span class=\"n\">serviceGroup<\/span><span class=\"p\">:<\/span> <span class=\"n\">ServiceGroup<\/span><span class=\"p\">!<\/span>\r\n    <span class=\"n\">team<\/span><span class=\"p\">:<\/span> <span class=\"n\">Team<\/span><span class=\"p\">!<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c\"># Enum\u5b9a\u7fa9<\/span>\r\n<span class=\"k\">enum<\/span> <span class=\"n\">TeamAuthority<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">PRIVILEGE<\/span>\r\n    <span class=\"n\">DEVELOP<\/span>\r\n    <span class=\"n\">AUDIT<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">enum<\/span> <span class=\"n\">AccountType<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">ADMIN<\/span>\r\n    <span class=\"n\">DEVELOPER<\/span>\r\n    <span class=\"n\">GUEST<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u6b65\u9aa42\uff1a\u5b9e\u73b0DTO\u7c7b<\/h2>\n<p>\u5c06\u4ece\u6570\u636e\u5e93\u4e2d\u83b7\u53d6\u7684\u6570\u636e\u5b58\u50a8\u5230entity\u5305\u4e2d\u521b\u5efa\u7684DTO\u7c7b\u4e2d\u3002<br \/>\n\u7531\u4e8e\u672c\u6b21\u5b9a\u4e49\u4e86\u4e09\u4e2a\u8868\uff0c\u56e0\u6b64\u9700\u8981\u4e3a\u6bcf\u4e2a\u8868\u521b\u5efa\u76f8\u5e94\u7684DTO\u7c7b\u3002<br \/>\n\u6b64\u5916\uff0c\u4e3a\u4e86\u907f\u514d\u7e41\u7410\u5730\u7f16\u5199Setter\/Getter\u65b9\u6cd5\uff0c\u4f7f\u7528\u4e86Lombok\u3002<br \/>\n\u5bf9\u4e8e\u4e0e\u4e3b\u952e\u76f8\u5173\u7684\u53d8\u91cf\uff0c\u6dfb\u52a0\u4e86@Id\u6ce8\u89e3\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Setter<\/span>\r\n<span class=\"nd\">@Getter<\/span>\r\n<span class=\"nd\">@AllArgsConstructor<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Account<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Id<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">accountId<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">userName<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">age<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">accountType<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">belongingServiceGroupId<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">belongingTeamId<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Setter<\/span>\r\n<span class=\"nd\">@Getter<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">ServiceGroup<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Id<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">serviceGroupId<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">serviceGroupName<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Setter<\/span>\r\n<span class=\"nd\">@Getter<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Team<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Id<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">teamId<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">belongingServiceGroupId<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">teamName<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">teamAuthority<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u6b65\u9aa43\uff1a\u5b9e\u73b0RepositoryIF<\/h2>\n<p>\u5728\u4e0e\u6570\u636e\u5e93\u7684\u4ea4\u4e92\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86Spring Data JDBC\u3002\u6211\u4eec\u4f1a\u5b9e\u73b0\u4e0e\u6bcf\u4e2a\u8868\u5bf9\u5e94\u7684RepositoryIF\uff0c\u5e76\u5c06\u5176\u5b58\u653e\u5728repository\u5305\u4e2d\u3002\uff08\u7531\u4e8e\u8fd9\u6b21\u662f\u7b80\u5355\u7684\u8868\u7ed3\u6784\uff0c\u6240\u4ee5\u6211\u4eec\u5c06IF\u6309\u7167\u8868\u7684\u5355\u4f4d\u8fdb\u884c\u4e86\u5206\u79bb\u3002\uff09<\/p>\n<p>\u7531\u4e8eCrudRepository\u4e2d\u5df2\u7ecf\u9ed8\u8ba4\u63d0\u4f9b\u4e86findById\u65b9\u6cd5\uff0c\u6240\u4ee5\u5982\u679c\u8981\u901a\u8fc7\u4e3b\u952e\u53c2\u6570\u83b7\u53d6\u6570\u636e\uff0c\u65e0\u9700\u5355\u72ec\u5b9e\u73b0\u6570\u636e\u5e93\u67e5\u8be2\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">AccountRepository<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">CrudRepository<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Account<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span><span class=\"o\">&gt;{<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">ServiceGroupRepository<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">CrudRepository<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">ServiceGroup<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u9700\u8981\u5b9e\u73b0\u4e00\u4e2a\u5173\u4e8e TeamRepository \u7684\u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u7684\u53c2\u6570\u9664\u4e86 PK \u4e4b\u5916\u8fd8\u6709\u5176\u4ed6\u7684 SELECT \u67e5\u8be2\uff0c\u65b9\u6cd5\u5b9a\u4e49\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">TeamRepository<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">CrudRepository<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Team<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"nd\">@Query<\/span><span class=\"o\">(<\/span><span class=\"s\">\"SELECT team_id, belonging_service_group_id, team_name, team_authority\"<\/span> <span class=\"o\">+<\/span>\r\n            <span class=\"s\">\" FROM team WHERE belonging_service_group_id = :serviceGroupId\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"nc\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Team<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">findByServiceGroupId<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">serviceGroupId<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u6b65\u9aa44\uff1a\u5b9e\u73b0\u63a7\u5236\u5668\u7c7b<\/h2>\n<p>\u5b9e\u73b0\u4e00\u4e2a\u80fd\u591f\u63a5\u6536API\u8bf7\u6c42\u7684\u63a7\u5236\u5668\u7c7b\u3002<\/p>\n<p>\u5728\u5e26\u6709@QueryMapping\u6ce8\u91ca\u7684\u65b9\u6cd5\u4e2d\u5b9a\u4e49\u5904\u7406\u63a5\u6536\u5230\u7684GraphQL\u67e5\u8be2\u7684\u65b9\u6cd5\u3002<br \/>\n\u672c\u6b21\u64cd\u4f5c\u4e2d\uff0caccountById\u662f\u76ee\u6807GraphQL\u67e5\u8be2\uff0c\u5e76\u901a\u8fc7\u5728accountId\u4e0a\u4f7f\u7528@Argument\u6ce8\u91ca\u6765\u660e\u786e\u63a5\u6536\u53c2\u6570\u7684\u8fc7\u7a0b\u3002<\/p>\n<p>\u6b64\u5916\uff0c\u6211\u4eec\u5c06\u5b9e\u73b0@SchemaMapping\uff0c\u4ee5\u83b7\u53d6\u4e0eAccountGraphQL\u6a21\u5f0f\u76f8\u5173\u8054\u7684serviceGroup\u548cTeam\u7684\u5904\u7406\u3002\u4e3a\u4e86\u83b7\u53d6\u4e0eAccount\u76f8\u5173\u8054\u7684ServiceGroup\u3001Team\u4ee5\u53ca\u4e0eTeam\u76f8\u5173\u8054\u7684ServiceGroup\uff0c\u6211\u4eec\u5b9a\u4e49\u4e86\u4e09\u4e2a\u65b9\u6cd5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Controller<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">AccountGraphqlController<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">Logger<\/span> <span class=\"n\">logger<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">LogManager<\/span><span class=\"o\">.<\/span><span class=\"na\">getLogger<\/span><span class=\"o\">(<\/span><span class=\"nc\">AccountGraphqlController<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">AccountRepository<\/span> <span class=\"n\">accountRepository<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">ServiceGroupRepository<\/span> <span class=\"n\">serviceGroupRepository<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">TeamRepository<\/span> <span class=\"n\">teamRepository<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">AccountGraphqlController<\/span><span class=\"o\">(<\/span><span class=\"kd\">final<\/span> <span class=\"nc\">AccountRepository<\/span> <span class=\"n\">accountRepository<\/span><span class=\"o\">,<\/span>\r\n                                    <span class=\"kd\">final<\/span> <span class=\"nc\">ServiceGroupRepository<\/span> <span class=\"n\">serviceGroupRepository<\/span><span class=\"o\">,<\/span>\r\n                                    <span class=\"kd\">final<\/span> <span class=\"nc\">TeamRepository<\/span> <span class=\"n\">teamRepository<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">accountRepository<\/span> <span class=\"o\">=<\/span> <span class=\"n\">accountRepository<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">serviceGroupRepository<\/span> <span class=\"o\">=<\/span> <span class=\"n\">serviceGroupRepository<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">teamRepository<\/span> <span class=\"o\">=<\/span> <span class=\"n\">teamRepository<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@QueryMapping<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Account<\/span> <span class=\"nf\">accountById<\/span><span class=\"o\">(<\/span><span class=\"nd\">@Argument<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">accountId<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">logger<\/span><span class=\"o\">.<\/span><span class=\"na\">info<\/span><span class=\"o\">(<\/span><span class=\"s\">\"=== Query Call, queryByAccountId. === \"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"kd\">final<\/span> <span class=\"nc\">Optional<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Account<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">acc<\/span> <span class=\"o\">=<\/span> <span class=\"n\">accountRepository<\/span><span class=\"o\">.<\/span><span class=\"na\">findById<\/span><span class=\"o\">(<\/span><span class=\"n\">accountId<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">acc<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@SchemaMapping<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">ServiceGroup<\/span> <span class=\"nf\">serviceGroup<\/span><span class=\"o\">(<\/span><span class=\"kd\">final<\/span> <span class=\"nc\">Account<\/span> <span class=\"n\">account<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"kd\">final<\/span> <span class=\"nc\">Optional<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">ServiceGroup<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">sg<\/span> <span class=\"o\">=<\/span> <span class=\"n\">serviceGroupRepository<\/span><span class=\"o\">.<\/span><span class=\"na\">findById<\/span><span class=\"o\">(<\/span><span class=\"n\">account<\/span><span class=\"o\">.<\/span><span class=\"na\">getBelongingServiceGroupId<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">sg<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@SchemaMapping<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Team<\/span> <span class=\"nf\">team<\/span><span class=\"o\">(<\/span><span class=\"kd\">final<\/span> <span class=\"nc\">Account<\/span> <span class=\"n\">account<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"kd\">final<\/span> <span class=\"nc\">Optional<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Team<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">t<\/span> <span class=\"o\">=<\/span> <span class=\"n\">teamRepository<\/span><span class=\"o\">.<\/span><span class=\"na\">findById<\/span><span class=\"o\">(<\/span><span class=\"n\">account<\/span><span class=\"o\">.<\/span><span class=\"na\">getBelongingTeamId<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">t<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@SchemaMapping<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">ServiceGroup<\/span> <span class=\"nf\">serviceGroup<\/span><span class=\"o\">(<\/span><span class=\"kd\">final<\/span> <span class=\"nc\">Team<\/span> <span class=\"n\">team<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"kd\">final<\/span> <span class=\"nc\">Optional<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">ServiceGroup<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">sg<\/span> <span class=\"o\">=<\/span> <span class=\"n\">serviceGroupRepository<\/span><span class=\"o\">.<\/span><span class=\"na\">findById<\/span><span class=\"o\">(<\/span><span class=\"n\">team<\/span><span class=\"o\">.<\/span><span class=\"na\">getBelongingServiceGroupId<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">sg<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u6b65\u9aa4\u4e94\uff1a\u8bbe\u7f6eGraphQL\u7aef\u70b9URL\u3002<\/h2>\n<p>\u5728application.yaml\u6587\u4ef6\u4e2d\u8fdb\u884cGraphQL API\u7aef\u70b9\u8def\u5f84\u7684\u914d\u7f6e\u548c\u542f\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">spring<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"c1\"># \u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u5b9a\u7fa9\u306f\u7701\u7565<\/span>\r\n  <span class=\"na\">graphql<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">graphiql<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">enabled<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span>\r\n      <span class=\"na\">path<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/graphiqls<\/span>\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0a\u662fAPI\u7684\u5b9e\u73b0\u5b8c\u6210\u3002<br \/>\n\u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u542f\u52a8\u5b9e\u9645\u7684API\u5e94\u7528\u7a0b\u5e8f\u5e76\u8fdb\u884c\u64cd\u4f5c\u786e\u8ba4\u3002<\/p>\n<h1>\u542f\u52a8\u548c\u6d4b\u8bd5GraphQLAPI\u670d\u52a1\u5668\u3002<\/h1>\n<p>\u53ea\u9700\u6267\u884cMain.java\u5373\u53ef\u542f\u52a8API\u5e94\u7528\u7a0b\u5e8f\u3002\u53ef\u4ee5\u4f7f\u7528Maven\u6784\u5efa\u5e76\u6267\u884cjar\u6587\u4ef6\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528IDE\u7684\u529f\u80fd\u8fdb\u884c\u6267\u884c\uff0c\u65e0\u8bba\u4f7f\u7528\u54ea\u79cd\u65b9\u6cd5\u90fd\u53ef\u4ee5\u3002<\/p>\n<p>\u6211\u51b3\u5b9a\u5c06GraphiQL\u7528\u4f5c\u4e3aGraphQL\u7684\u5ba2\u6237\u7aef\u5de5\u5177\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\uff1ahttp:\/\/localhost:8080\/graphql<\/ul>\n<\/li>\n<\/ul>\n<p>\u30e1\u30bd\u30c3\u30c9\uff1aPOST<\/p>\n<h2>\u786e\u8ba4\u52a8\u4f5c1<\/h2>\n<p>\u901a\u8fc7\u6267\u884c\u4ee5\u4e0b\u67e5\u8be2\uff0c\u6211\u4eec\u6210\u529f\u83b7\u53d6\u4e86\u8d26\u6237\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">query<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">accountById<\/span><span class=\"p\">(<\/span><span class=\"n\">accountId<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"ACC01\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">accountId<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">userName<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">age<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">accountType<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8187913a08637a6ad6d3\/62-0.png\" alt=\"image.png\" \/><\/div>\n<h2>\u786e\u8ba4\u52a8\u4f5c2<\/h2>\n<p>\u901a\u8fc7\u6267\u884c\u4ee5\u4e0b\u67e5\u8be2\uff0c\u53ef\u4ee5\u4e00\u6b21\u6027\u83b7\u53d6\u5e10\u6237\u4fe1\u606f\u53ca\u5176\u5173\u8054\u7684\u670d\u52a1\u7ec4\u3001\u56e2\u961f\u548c\u4e0e\u56e2\u961f\u5173\u8054\u7684\u670d\u52a1\u7ec4\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">query<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">accountById<\/span><span class=\"p\">(<\/span><span class=\"n\">accountId<\/span><span class=\"p\">:<\/span><span class=\"s2\">\"ACC01\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">accountId<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">userName<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">age<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">accountType<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">serviceGroup<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">serviceGroupId<\/span>\r\n            <span class=\"n\">serviceGroupName<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        <span class=\"n\">team<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">teamId<\/span>\r\n            <span class=\"n\">teamName<\/span>\r\n            <span class=\"n\">teamAuthority<\/span>\r\n            <span class=\"n\">serviceGroup<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">serviceGroupId<\/span>\r\n                <span class=\"n\">serviceGroupName<\/span>\r\n            <span class=\"p\">}<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8187913a08637a6ad6d3\/66-0.png\" alt=\"image.png\" \/><\/div>\n<h1>\u6700\u7ec8<\/h1>\n<p>\u6211\u5011\u5728\u9019\u6b21\u8b1b\u89e3\u4e2d\u4ecb\u7d39\u4e86\u7c21\u55ae\u7684\u67e5\u8a62\u793a\u4f8b\u5be6\u65bd\u6b65\u9a5f\uff0c\u4f46\u4e0b\u6b21\u6211\u5011\u60f3\u8a66\u8a66Mutation\u548c\u5206\u9801\u7b49\u61c9\u7528\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Spring for GraphQL\u662f\u4e00\u4e2a\u7528\u4e8e\u6784\u5efaGraphQL API\u7684Spring\u6846\u67b6\u3002 \u4e00\u822c\u6765\u8bf4\uff0c\u6784\u5efaJ [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-47865","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528Spring for GraphQL\u6784\u5efaGraphQL API\u7684\u6b65\u9aa4 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528spring-for-graphql\u6784\u5efagraphql-api\u7684\u6b65\u9aa4\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Spring for GraphQL\u6784\u5efaGraphQL API\u7684\u6b65\u9aa4\" \/>\n<meta property=\"og:description\" content=\"Spring for GraphQL\u662f\u4e00\u4e2a\u7528\u4e8e\u6784\u5efaGraphQL API\u7684Spring\u6846\u67b6\u3002 \u4e00\u822c\u6765\u8bf4\uff0c\u6784\u5efaJ [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528spring-for-graphql\u6784\u5efagraphql-api\u7684\u6b65\u9aa4\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-10T02:03:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T11:04:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8187913a08637a6ad6d3\/6-0.png\" \/>\n<meta name=\"author\" content=\"\u79d1, \u96c5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u96c5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/\",\"name\":\"\u4f7f\u7528Spring for GraphQL\u6784\u5efaGraphQL API\u7684\u6b65\u9aa4 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-06-10T02:03:03+00:00\",\"dateModified\":\"2024-04-29T11:04:50+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528Spring for GraphQL\u6784\u5efaGraphQL API\u7684\u6b65\u9aa4\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\",\"name\":\"\u79d1, \u96c5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u96c5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528Spring for GraphQL\u6784\u5efaGraphQL API\u7684\u6b65\u9aa4 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528spring-for-graphql\u6784\u5efagraphql-api\u7684\u6b65\u9aa4\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Spring for GraphQL\u6784\u5efaGraphQL API\u7684\u6b65\u9aa4","og_description":"Spring for GraphQL\u662f\u4e00\u4e2a\u7528\u4e8e\u6784\u5efaGraphQL API\u7684Spring\u6846\u67b6\u3002 \u4e00\u822c\u6765\u8bf4\uff0c\u6784\u5efaJ [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528spring-for-graphql\u6784\u5efagraphql-api\u7684\u6b65\u9aa4\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-06-10T02:03:03+00:00","article_modified_time":"2024-04-29T11:04:50+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8187913a08637a6ad6d3\/6-0.png"}],"author":"\u79d1, \u96c5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u96c5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"4 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/","name":"\u4f7f\u7528Spring for GraphQL\u6784\u5efaGraphQL API\u7684\u6b65\u9aa4 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-06-10T02:03:03+00:00","dateModified":"2024-04-29T11:04:50+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528Spring for GraphQL\u6784\u5efaGraphQL API\u7684\u6b65\u9aa4"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a","name":"\u79d1, \u96c5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","caption":"\u79d1, \u96c5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8spring-for-graphql%e6%9e%84%e5%bb%bagraphql-api%e7%9a%84%e6%ad%a5%e9%aa%a4\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=47865"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47865\/revisions"}],"predecessor-version":[{"id":87081,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47865\/revisions\/87081"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=47865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=47865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=47865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}