मैं स्प्रिंग वेब फ्लक्स का उपयोग करके सीखने के उद्देश्य के लिए एक वेब एप्लिकेशन बना रहा हूं, मेरे पास एक ऐसा फ़ंक्शन है जो पहले जांचता है कि रिकॉर्ड बाहर निकलता है तो यह इसे अपडेट करता है अन्यथा यह कस्टम NotFoundException फेंकता है। मुद्दा यह है कि जब मैं मोनो लौटाता हूं तो नियंत्रक 404 त्रुटि फेंकता है लेकिन जब मैं क्लास ऑब्जेक्ट को वापस करता हूं जिसे अपडेट किया गया था तो यह ठीक चलता है और मैं पूरी वस्तु वापस नहीं करना चाहता हूं।

निम्नलिखित कोड ठीक चलता है

public Mono<Application> publish(String id,boolean publish) 
{
    return appRepository.findById(id).flatMap( a -> {
        a.setPublished(publish);
        return appRepository.save(a);
    }).switchIfEmpty( Mono.error(new NotFoundException("Application Not Found")));
}

और नीचे कोड जहां 404 त्रुटि होती है

public Mono<Void> publish(String id,boolean publish) 
{
    return appRepository.findById(id).flatMap( a -> {
        a.setPublished(publish);
        appRepository.save(a);
        return Mono.empty().then();
    }).switchIfEmpty( Mono.error(new NotFoundException("Application Not Found")));
}

मैंने रिएक्टिवमोंगो रिपोजिटरी से रिपोजिटरी बढ़ा दी है और नियंत्रक वर्ग सिर्फ सेवा समारोह को बुला रहा है

@PutMapping(APP_ROOT_URL + "/{id}/publish")
public Mono<Void>  publish(@PathVariable("id") String id)
{
    return appService.publish(id, true);
}
0
Haider 18 जुलाई 2020, 00:33

1 उत्तर

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

पहली विधि 404 नहीं लौटाती है क्योंकि:

appRepository.save(a) स्थायी निकाय लौटाता है। खाली मोनो नहीं। तो स्विचइफइम्प्टी क्लॉज ट्रिगर नहीं होता है।

यह ReactiveCrudRepository के दस्तावेज़ से है (ReactiveMongoRepository के मूल भंडारों में से एक)

   /**
     * Saves a given entity. Use the returned instance for further operations as the save operation might have changed the
     * entity instance completely.
     *
     * @param entity must not be {@literal null}.
     * @return {@link Mono} emitting the saved entity.
     * @throws IllegalArgumentException in case the given {@literal entity} is {@literal null}.
     */
    <S extends T> Mono<S> save(S entity);

दूसरी विधि में, आप स्पष्ट रूप से खाली मोनो लौटा रहे हैं।

एक और बात, मैं बताना चाहूंगा: स्विचआईएफइम्प्टी क्लॉज सही ढंग से नहीं रखा गया है। चूंकि findById किसी आईडी के लिए रिकॉर्ड नहीं मिलने पर एक खाली मोनो लौटाता है, switchIfEmpty उसके बाद आना चाहिए। यदि आप switchIfEmpty को save के बाद रखते हैं, तो यह कभी भी खाली मोनो नहीं लौटाएगा।

तो आपके पास कुछ ऐसा होना चाहिए:

public Mono<Application> publish(String id,boolean publish) 
{
    return appRepository.findById(id)
      .switchIfEmpty( Mono.error(new NotFoundException("Application Not Found")))
      .flatMap( a -> {
        a.setPublished(publish);
        return appRepository.save(a);
    });
}

और अगर आप चाहते हैं कि विधि का रिटर्न प्रकार Mono<Void> हो तो बस कुछ इस तरह है:

public Mono<Void> publish(String id, boolean publish) 
{
    return appRepository.findById(id)
      .switchIfEmpty( Mono.error(new NotFoundException("Application Not Found")))
      .flatMap( a -> {
        a.setPublished(publish);
        return appRepository.save(a);
    })
    .then();
}
2
Toerktumlare 18 जुलाई 2020, 12:35