使用AWS Java SDK通过AppSync查询DynamoDB表数据的实现问题
完整查询逻辑实现步骤
1. 确认Maven编译配置包含生成的Resolver类
首先需要将target目录下自动生成的GraphQL相关类加入项目编译路径,避免无法引用生成的Resolver、请求、响应类,修改pom.xml配置如下:
<build> <plugins> <!-- 原有其他插件 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <!-- 替换为你项目中实际生成Resolver的target子目录 --> <source>${project.build.directory}/generated-sources/graphql</source> </sources> </configuration> </execution> </executions> </plugin> </plugins> </build>
配置完成后执行mvn compile,即可正常导入生成的类。
2. 构造GraphQL查询请求
以查询用户表的getUser接口为例,直接使用生成的类构造请求即可:
// 导入自动生成的查询类、入参类 import com.yourbusiness.generated.queries.GetUser; import com.yourbusiness.generated.types.GetUserInput; // 构造查询入参 GetUserInput queryInput = GetUserInput.builder() .userId("u_001") // 替换为实际查询条件 .build(); // 组装GraphQL查询对象 GetUser getUserQuery = GetUser.builder() .input(queryInput) .build();
3. 执行请求并处理响应
调用已初始化的awsAppSyncClient执行查询,以下是同步调用的示例代码:
try { // 发送查询请求并获取响应数据 GetUser.Data responseData = awsAppSyncClient.execute(getUserQuery).data(); if (responseData != null) { // 提取返回的业务数据 GetUser.User userInfo = responseData.getUser(); // 此处编写你的业务逻辑处理返回结果 System.out.println("查询到用户:" + userInfo.getUserName()); } } catch (AWSAppSyncClientException e) { // 处理客户端异常:参数错误、鉴权失败、网络不通等 e.printStackTrace(); } catch (AWSAppSyncServiceException e) { // 处理服务端异常:Resolver执行错误、DynamoDB操作失败等 e.printStackTrace(); }
如果需要异步调用,替换为awsAppSyncClient.executeAsync(getUserQuery)方法即可,返回值为CompletableFuture类型。
4. 可选:手动构造查询请求
如果需要动态拼接查询语句,也可以不使用生成类,手动构造请求:
// 手写GraphQL查询语句 String queryStr = "query GetUser($input: GetUserInput!) { getUser(input: $input) { userId userName email } }"; // 组装动态变量 Map<String, Object> variables = new HashMap<>(); Map<String, Object> inputMap = new HashMap<>(); inputMap.put("userId", "u_001"); variables.put("input", inputMap); // 构造请求 AppSyncRequest request = AppSyncRequest.builder() .query(queryStr) .variables(variables) .build(); // 执行请求后自行序列化返回结果 AppSyncResponse response = awsAppSyncClient.execute(request); String responseJson = response.content().asString(); // 此处可使用Jackson等工具将json转为自定义实体类
常见注意事项
- 确保你使用的
credentialsProvider对应的IAM身份,权限策略中包含appsync:GraphQL操作权限,资源范围要覆盖你调用的AppSync API路径 - 如果查询返回空值,优先检查AppSync Resolver的映射模板是否正确,以及AppSync的服务角色是否拥有DynamoDB表的读写权限
- 自动生成类的包名可在AppSync Maven插件配置中自定义,避免和现有业务类包名冲突
内容的提问来源于stack exchange,提问作者Manushi
相关产品推荐
相关产品推荐

