我在 Spring Boot 应用程序中使用新的 Spring for Graphql。我的问题是,当向
/graphql
端点发出 POST 请求时,服务器总是响应 404。
这些是我的 gradle 依赖项
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-graphql'
implementation 'org.springframework.boot:spring-boot-starter-mail'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
implementation 'org.flywaydb:flyway-core'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'org.postgresql:postgresql'
annotationProcessor 'org.projectlombok:lombok'
我按照本教程中的步骤创建控制器(以前称为解析器,实际上我将所有旧的 Graphql 解析器更改为新的 @QueryMapping 和 @MutationMapping 注释)
这是我的 StepController 的代码
@Slf4j
@Controller
@RequiredArgsConstructor
public class StepController {
private final StepService stepService;
private final TokenService tokenService;
@QueryMapping
public ArrayList<Step> getSteps(String templateId) {
return stepService.getSteps(templateId);
}
@MutationMapping
public Step createStep(StepInput input, DataFetchingEnvironment env) {
return stepService.createStep(input, tokenService.getUserId(env));
}
}
我还在我的项目中使用 WebSecurity,通过在 SecurityConfig.class 中创建 Bean,将我已弃用的 WebSecurityConfigurerAdapter 更改为更现代的执行方式
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.cors()
.configurationSource(request -> {
var cors = new CorsConfiguration();
cors.setAllowedOrigins(List.of("http://localhost:4200", "electron://altair"));
cors.setAllowedMethods(List.of("GET", "POST", "DELETE", "OPTIONS"));
cors.setAllowedHeaders(List.of("*"));
cors.setAllowCredentials(true);
return cors;
})
.and()
.csrf().disable()
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/graphql").permitAll()
.antMatchers(HttpMethod.GET, "/stomp/**").permitAll()
.anyRequest().authenticated()
.and()
// this disables session creation on Spring Security
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
return http.build();
}
}
我的 GraphQl 架构是在文件夹结构中的
resources/graphql
中构建的,在切换到新的 Spring Boot Graphql 之前我对此没有任何问题
更新为了安全起见:我删除了整个文件夹结构,并将其替换为一个仅包含登录突变和从未使用过的查询的schema.graphqls
文件,只是为了避免
Query needed
编译器错误type Mutation {
login(email: String!, password: String!): Login!
}
type Login {
token: String
}
// unused, just to make the compiler happy
type Query {
getLogin: Login
}
应用程序属性
spring.banner.location=classpath:logo.txt
spring.main.banner-mode=console
spring.output.ansi.enabled=ALWAYS
spring.main.allow-bean-definition-overriding=true
spring.mail.host=mail.blablabla
spring.mail.port=587
spring.mail.username=no-reply@blablabla
spring.mail.password=blablalba
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=false
spring.profiles.include=prod,dev
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL95Dialect
spring.jpa.hibernate.ddl-auto=validate
spring.servlet.multipart.max-file-size=512KB
我希望我提供了有关如何设置我的项目的足够信息。我真的很感激任何可以解决这个问题的帮助。我昨天搜索了一整个晚上,终于在这里发布这个问题。我希望有人能帮助我。谢谢
spring.graphql.schema.locations=classpath*:graphql/**/
默认情况下,Boot starter 在位置类路径:graphql/**(通常是 src/main/resources/graphql)下查找扩展名为“.graphqls”或“.gqls”的模式文件。您还可以使用文件系统位置或 Spring 资源层次结构支持的任何位置,包括从远程位置、存储或内存加载架构文件的自定义实现。
使用 classpath
:graphql/**/ 跨多个类路径位置查找模式文件,例如跨多个模块。*
https://github.com/graphql-java-kickstart/graphql-spring-boot/discussions/962<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphiql-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
spring.graphql.graphiql.enabled=true