我正在寻找使用其他对象类型将字段值传递给已解析的字段。
如果我有“客户>用户>个人资料”,则可以用另一种方式输入-如何将客户中的CustomerID字段值作为参数或变量传递给个人资料,以便正确解析?
配置文件
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.example.demo.resolver.Mutation;
import com.example.demo.resolver.Query;
import graphql.GraphQL;
import graphql.schema.GraphQLSchema;
import static com.coxautodev.graphql.tools.SchemaParser.newParser;
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Autowired
private static Query query;
@Autowired
private static Mutation mutation;
@Bean
public BCryptPasswordEncoder passwordEncoder() {
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
return bCryptPasswordEncoder;
}
@Autowired
public GraphQL graphQL() {
return GraphQL.newGraphQL(graphQLSchema())
.build();
}
public static GraphQLSchema graphQLSchema(){
return newParser()
.file("schema.graphqls")
.resolvers(query,mutation)
.build()
.makeExecutableSchema();
}
}
Run Code Online (Sandbox Code Playgroud)
图式
type User {
uid: Long!
name: …Run Code Online (Sandbox Code Playgroud) 我真的很喜欢SPQR轻松地将graphql与现有系统集成的方式,我唯一想看的是.graphqls文件,因此我可以在GraphQL语法上学习更多。
有没有一种方法可以从集成SPQR注释的现有代码中生成方案文件?
为了提供一些代码,让我们使用GitHub站点上的相同代码
实体:
public class User {
private String name;
private Integer id;
private Date registrationDate;
@GraphQLQuery(name = "name", description = "A person's name")
public String getName() {
return name;
}
@GraphQLQuery
public Integer getId() {
return id;
}
@GraphQLQuery(name = "regDate", description = "Date of registration")
public Date getRegistrationDate() {
return registrationDate;
}
}
Run Code Online (Sandbox Code Playgroud)
服务等级:
class UserService {
@GraphQLQuery(name = "user")
public User getById(@GraphQLArgument(name = "id") Integer id) {
...
}
} …Run Code Online (Sandbox Code Playgroud) 我正在使用这个端点:
@PostMapping("graphql")
public ResponseEntity<Object> getResource(@RequestBody Object query) { // String query
ExecutionResult result;
if (query instanceof String) {
result = graphQL.execute(query.toString()); // if plain text
} else{
String queryString = ((HashMap) query).get("query").toString();
Object variables = ((HashMap) query).get("variables");
ExecutionInput input = ExecutionInput.newExecutionInput()
.query(queryString)
.variables((Map<String, Object>) variables) // "var1" -> "test1"
.build();
result = graphQL.execute(input);
}
return new ResponseEntity<Object>(result, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)
当我没有变量时它工作正常:
query {
getItem(dictionaryType: "test1") {
code
name
description
}
}
Run Code Online (Sandbox Code Playgroud)
当我添加variable它开始失败时,请参见此处:
query {
getItem(dictionaryType: $var1) {
code
name …Run Code Online (Sandbox Code Playgroud) 我是 GraphQL 的新手。有一个要求是从 CUSTOMERS 表中查询所有符合条件的数据,满足条件:GENDER == 'MALE' or 'AGE' >= 20。GQL 应该是什么样的?
目前我们想使用 resttemplate 在 springboot 应用程序中使用一个 graphQL 端点
但是,当我们使用以下查询发出 POST 请求时,我们总是收到相同的错误 {"errors":[{"message":"No query string was present"}]}
下面是片段,我们要运行,
@Test
public void testSwoop(){
RestTemplate restTemplate = restTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Bearer *************");
headers.add("content-type", "application/graphql");
String query1 = "{\n" +
" \"query\": query {\n" +
" \"locationTypes\": {\n" +
" \"edges\": \n" +
" {\n" +
" \"node\": \n" +
" {\n" +
" \"name\"\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
String URL …Run Code Online (Sandbox Code Playgroud) GraphQL 和 Java (Spring) 一团糟。有多个项目,多个示例,但完全不一致。
我理解 Spring Boot 应该提供的是 OOTB 工作解决方案,并且(在某种程度上)它是这样工作的。为您提供此类体验的项目位于 Github https://github.com/graphql-java-kickstart 上。特别是https://github.com/graphql-java-kickstart/graphql-spring-boot让你可以创建模式,制作解析器,其他一切都是自动完成的。
问题是当您尝试用自定义 datafetcher 替换解析器(这看起来非常简单的 datafetcher)时。据我所知,不可能制作异步解析器或批量解析器 - 您必须制作 datafetcher。
要制作自定义数据提取器,需要进行自定义接线等,替换 spring-boot 解决方案,或以某种方式使用它(如何?)。没有一点是正确的,如何正确地做到这一点。我什至发现 BatchedDataFetcher 在它们获得良好的 Spring Boot 支持/示例之前已被弃用(!)(请参阅:GraphQL Java:使用 @Batched DataFetcher)
正因为如此,我什至不知道去哪里寻找解决方案。我希望看到的是有一个例子,它有:
我从波纹管样品中使用,但添加库时出现错误:
贝娄是我的build.gradle (project):
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
maven { url "https://jitpack.io" }
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
classpath 'com.apollographql.android:gradle-plugin:0.1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Run Code Online (Sandbox Code Playgroud)
贝娄是我的build.gradle (Module):
apply plugin: …Run Code Online (Sandbox Code Playgroud) 我是Spring Boot + GraphQL的新手。我需要在我的控制器类中获取查询/更改操作名称。
目的:需要某些用户的特定突变/查询操作的最高权限。在这里,用户类型将作为请求标头传递并得到验证,并检查是否允许用户访问该操作。
@PostMapping
public ResponseEntity<Object> callGraphQLService(@RequestBody String query, @RequestHeader("user") String userName) {
ExecutionResult result = graphService.getGraphQL().execute(ExecutionInput.newExecutionInput()
.query(query)
.context(userName)
.build());
return new ResponseEntity<>(result, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)
建议任何有效的机制来执行针对特定查询/突变的授权
我正在考虑将 GraphQL 功能添加到我的 Spring Boot 应用程序中。
我发现有两个工件。
一个是com.graphql-java-kickstart:graphql-spring-boot-starter,另一个是com.graphql-java:graphql-spring-boot-starter。
我应该选择哪一个?
我有一个 Java 程序,除其他外,它从 XML 文件读取原始 GraphQL 查询并通过 HTTP 将它们发送到给定端点。问题是服务器只接受正确格式的 GraphQL 查询,这意味着不允许使用额外的空格、换行符等。所以基本上我必须将它们写在一行中,因为任何换行符都会通过添加大量空格来匹配 XML 层次结构(包含查询的元素不是根元素)来破坏整个查询。
正如您所知,单行查询,尤其是长查询,对人类不友好,而且难以阅读。到处都有很多代码格式化程序/美化程序,在线、IDEA、Postman、Insomnia 等内部,所有这些都可以通过单击按钮来完成。
工作 XML 文件(单行查询):
<request>
<url>http://localhost:8080/graphql</url>
<type>GRAPHQL</type>
<body>mutation { login(input: {username: \"user\", password: \"12345\"}) {status}}</body>
</request>
Run Code Online (Sandbox Code Playgroud)
所需的XML文件(多行查询):
<request>
<url>http://localhost:8080/graphql</url>
<type>GRAPHQL</type>
<body>
mutation {
login(input: {username: "user", password: "12345"}) {
status
}
}
</body>
</request>
Run Code Online (Sandbox Code Playgroud)
我该如何处理这种情况?在发送之前,我应该对“body”字符串进行格式化。是否有任何“美化”库,或者我应该编写自定义符号“删除器”?
我的目标是遍历一个 graphql Java 文档对象并返回最大深度。
示例:深度 0
{
name
}
Run Code Online (Sandbox Code Playgroud)
示例:深度 1
{
viewer{
viewerId
}
}
Run Code Online (Sandbox Code Playgroud)
示例:深度 2
{
viewer{
albums{
albumId
}
}
}
Run Code Online (Sandbox Code Playgroud)
示例:深度 2。如您所见,两张专辑/歌曲都在同一个父“观众”下
{
viewer{
albums{
albumId
}
songs{
songId
}
}
}
Run Code Online (Sandbox Code Playgroud)
示例:深度 3
{
viewer{
albums{
tracks{
trackId
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经编写了基本代码来遍历它,但我的代码不适用于第二个版本的 depth = 2。它返回 depth = 3 而不是 2。原因是因为它在同一个父项下计数两次。本质上的逻辑是这样的:depth = depth + 1 每当一个字段有子项时。
import graphql.language.Document;
import graphql.language.Node;
import graphql.language.OperationDefinition;
public int checkDepthLimit(String query) {
Document document;
try {
document = documentParser.parseDocument(query); …Run Code Online (Sandbox Code Playgroud) 我正在调用公开GraphQL接口的服务。因此,我能够发布GraphQL查询并通过curl接收回数据。现在,我想编写一个服务来为我构建查询(动态地,基于我发送端点的查询参数),并发送请求并返回响应。
我正在使用Spring Boot 2.1.4。
我知道您可以在Spring中使用弹性搜索库来构建查询。想知道GraphQL是否有类似的东西。
graphql-java ×13
graphql ×10
java ×7
spring-boot ×5
android ×1
apollo ×1
formatting ×1
graphiql ×1
graphql-spqr ×1
mysql ×1
recursion ×1
resttemplate ×1
rethinkdb ×1
spring ×1