मैं GraphQL और MongoeDB के साथ एक स्प्रिंग बूट REST एप्लिकेशन बनाने का प्रयास करता हूं (मैं उस लेख से शुरू करता हूं https://medium.com/oril/spring-boot-graphql-mongodb-8733002b728a)। एप्लिकेशन शुरू होता है लेकिन जब मैं किसी एंडपॉइंट पर कुछ पोस्ट करने का प्रयास करता हूं तो मुझे 404 त्रुटि मिली।

मैंने यह भी पढ़ा है कि @PostConstruct अब 2.2.0 के साथ समर्थित नहीं है (यह एक और समस्या है जिसे मैं बाद में समझने की कोशिश करूंगा, मैं स्टार्टअप के दौरान डेटाबेस को प्रीलोड करने का प्रयास करता हूं)।

पोम.एक्सएमएल

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.tsoai-api</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <lombok.version>1.18.10</lombok.version>
        <commons-io.version>2.5</commons-io.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>${commons-io.version}</version>
        </dependency>
        <dependency>
            <groupId>com.graphql-java</groupId>
            <artifactId>graphql-spring-boot-starter</artifactId>
            <version>3.6.0</version>
        </dependency>
        <dependency>
            <groupId>com.graphql-java</groupId>
            <artifactId>graphql-java-tools</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.graphql-java</groupId>
            <artifactId>graphiql-spring-boot-starter</artifactId>
            <version>3.6.0</version>
        </dependency>

        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

मेरी मुख्य एप्लिकेशन फ़ाइल इस तरह दिखती है (कुछ खास नहीं!):

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

मेनकंट्रोलर.जावा

@RestController
@RequestMapping(path = "/query")
public class MainController {

    private GraphQL graphQL;
    private GraphQlUtility graphQlUtility;

    @Autowired
    MainController(GraphQlUtility graphQlUtility) throws IOException {
        this.graphQlUtility = graphQlUtility;
        graphQL = graphQlUtility.createGraphQlObject();
    }

    @PostMapping(path= "/")
    public ResponseEntity query(@RequestBody String query){
        ExecutionResult result = graphQL.execute(query);
        System.out.println("errors: "+result.getErrors());
        return ResponseEntity.ok(result.getData());
    }

}

जब मैं http://localhost:8080/query पर पोस्ट करता हूं, तो मुझे यह त्रुटि मिली:

{
    "timestamp": "2019-10-19T16:10:19.136+0000",
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/query"
}
0
Jonathan Anctil 19 अक्टूबर 2019, 20:02

3 जवाब

सबसे बढ़िया उत्तर

यह केवल /query/ से मेल खाएगा लेकिन /query से नहीं। यदि आप /query और /query/ दोनों का मिलान करना चाहते हैं, तो आप क्वेरी विधि में @PostMapping के path को डिफ़ॉल्ट के रूप में छोड़ सकते हैं।

@RestController
@RequestMapping(path = "/query")
public class MainController {

    @PostMapping
    public ResponseEntity query(@RequestBody String query){

    }

}
1
Ken Chan 19 अक्टूबर 2019, 21:45

इस त्रुटि का एक कारण हो सकता है कि स्प्रिंग बूट इस वर्ग को स्कैन नहीं कर रहा है। कृपया उस पैकेज के साथ स्प्रिंग बूट मुख्य वर्ग पर कंपोनेंटस्कैन एनोटेशन जोड़ने का प्रयास करें जहां आप अपने नियंत्रकों को नीचे दिए गए अनुसार रखते हैं। @ComponentScan(basePackages= {"com.example"})

1
Ashok Prajapati 19 अक्टूबर 2019, 20:34
हाँ, मैंने atComponentScan के बारे में पढ़ा है, लेकिन मुझे लगता है कि आपको इसका उपयोग केवल तभी करना चाहिए जब आप atSpringBootApplication एनोटेशन से छुटकारा पा लें।
 – 
Jonathan Anctil
19 अक्टूबर 2019, 20:55
मुझे लगता है कि ऐसा नहीं है कि हम इस एनोटेशन का उपयोग SpringBooApplication एनोटेशन से छुटकारा पाने के लिए करते हैं बल्कि घटक स्कैनिंग के लिए अतिरिक्त कॉन्फ़िगरेशन डालने के लिए करते हैं। आपके पास एकाधिक @ComponentScan एनोटेशन हो सकते हैं।
 – 
Ashok Prajapati
19 अक्टूबर 2019, 21:06

उस पोर्ट की जांच करें जिस पर आपका स्प्रिंग सर्वर चल रहा है, मध्यम पोस्ट के अनुसार उन्होंने इसे :8000 पर चलाने के लिए कॉन्फ़िगर किया है, जबकि आप :8080 पर हिट कर रहे हैं। त्रुटि वही बताती है कि यह इस एपीआई-एंडपॉइंट पर मैप किए गए किसी भी नियंत्रक को नहीं ढूंढ सकता है।

http://लोकलहोस्ट:8000/क्वेरी/

`

0
Naman 19 अक्टूबर 2019, 20:49
मैंने इसे 8080 के लिए बदल दिया क्योंकि मेरे पास पहले से ही 8000 पोर्ट पर कुछ है।
 – 
Jonathan Anctil
19 अक्टूबर 2019, 20:29
1
क्वेरी के बाद एक '/' जोड़ें।
 – 
Naman
19 अक्टूबर 2019, 20:39