graphql servlet ไม่ได้เริ่มต้นด้วย graphql-java-tools (ไม่พบไฟล์ schema?)

Sep 15 2020

ดังนั้นตาม graphql-java-kickstart / graphql-java-tools จุดสิ้นสุด 'graphql' ควรพร้อมใช้งานเมื่อการพึ่งพา 'com.graphql-java-kickstart: graphql-spring-boot-starter' ถูกเพิ่มเข้าไปในโปรเจ็กต์และ. ไฟล์สคีมา graphqls จะถูกสแกนโดยอัตโนมัติ

ฉันมีการอ้างอิงต่อไปนี้:

...
        <spring-boot.version>2.3.3.RELEASE</spring-boot.version>
        <graphql.version>7.0.1</graphql.version>
        <graphql-java-tools.version>6.2.0</graphql-java-tools.version>

...

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>${spring-boot.version}</version> </dependency> <!-- graphql --> <dependency> <groupId>com.graphql-java-kickstart</groupId> <artifactId>graphql-spring-boot-starter</artifactId> <version>${graphql.version}</version>
        </dependency>

        <dependency>
            <groupId>com.graphql-java-kickstart</groupId>
            <artifactId>graphiql-spring-boot-starter</artifactId>
            <version>${graphql.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.graphql-java-kickstart</groupId> <artifactId>graphql-java-tools</artifactId> <version>${graphql-java-tools.version}</version>
        </dependency>

คำจำกัดความของสคีมา:

in query.graphqls:
type Query {
    user(username: String!)
    users: [User]
}

in user.graphqls:
type User {
    userId: Number!
    username: String!
}

และ GraphQLQueryResolver สำหรับสิ่งนั้น:

@Component
public class UserQueryResolver implements GraphQLQueryResolver {
    private final UserRepository userRepository;

    public UserQueryResolver(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public Iterable<User> users() {
        return this.userRepository.findAll();
    }

    public User user(String username) {
        return this.userRepository.findByUsername(username).orElseThrow();
    }
}

public interface UserRepository extends JpaRepository<User, Integer> {
    Optional<User> findByUsername(String username);
}

ตามเอกสาร:

servlet สามารถเข้าถึงได้ที่ / graphql หากเพิ่ม graphql-spring-boot-starter เป็นการอ้างอิงกับแอ็พพลิเคชันสำหรับบูตและ GraphQLSchema bean อยู่ในแอปพลิเคชัน ดูตัวอย่างง่ายๆสำหรับค่าต่ำสุดที่จำเป็น

นอกจากนี้ยังสามารถสร้างสคีมา GraphQL โดยอัตโนมัติเมื่อพบไลบรารี schema graphql-java ที่รองรับบน classpath

ไลบรารี graphql-java-tools ควรสร้างสคีมาโดยอัตโนมัติภายใต้เงื่อนไขเหล่านี้:

GraphQLResolver และ GraphQLScalar beans ทั้งหมดพร้อมกับ bean ประเภท SchemaParserDictionary (เพื่อให้คลาสอื่น ๆ ทั้งหมด) จะถูกใช้เพื่อสร้าง GraphQLSchema ไฟล์ใด ๆ บน classpath ที่ชื่อ * .graphqls จะถูกใช้เพื่อจัดเตรียมข้อกำหนดสคีมา ดู Readme สำหรับข้อมูลเพิ่มเติม

ฉันคิดว่าฉันมีทุกอย่างที่ต้องการ แต่การนำทางเพื่อlocalhost:8080/graphqlให้ 404 NB: ใช้localhost:8080/graphiqlงานได้ แต่ไม่สามารถโหลดสคีมาได้ มันบอกว่า:

{
  "timestamp": "2020-09-15T12:22:21.748+00:00",
  "status": 404,
  "error": "Not Found",
  "message": "No message available",
  "path": "/graphql"
}

ฉันขาดอะไรไป?

คำตอบ

d01berg Sep 17 2020 at 02:16

เห็นได้ชัดว่าแอพลิเคชันไม่สามารถหา JpaRepositories ใด ๆ เพราะชั้น SpringBootApplication เริ่มต้นตั้งอยู่ในcom.package.some.appในขณะที่เก็บอยู่ในcom.package.some.domain.repositories เครื่องสแกนคอมโพเนนต์กำลังสแกนส่วนประกอบที่มีแพ็คเกจcom.package.som.app เท่านั้น *