当前位置: 首页 > 知识库问答 >
问题:

Micronaut@替换为声明性客户端

陶飞英
2023-03-14

我将使用来自Micronaut文档(声明性Http客户端)的代码-我正在使用Spock

宠物手术。JAVA

@Validated
public interface PetOperations {
    @Post
    Single<Pet> save(@NotBlank String name, @Min(1L) int age);
}

我有一个声明式客户端

@Client("/pets") 
public interface PetClient extends PetOperations { 

    @Override
    Single<Pet> save(String name, int age); 
}

我的目标是当我运行一个测试类时,我想调用(@Replaces)另一个类(PetDummy),而不是PetClient,PetDummy类位于我的测试文件夹中

@Primary
@Replaces(PetClient.class)
@Singleton
public class PetDummy implements PetOperations {

    @Override
    public Single<Pet> save(String name, int age) {
        Pet pet = new Pet();
        pet.setName(name);
        pet.setAge(age);
        // save to database or something
        return Single.just(pet);
    }
}

测试类:

class PetTest extends Specification {

    @Shared
    @AutoCleanup
    ApplicationContext applicationContext = ApplicationContext.run();
    //EmbeddedServer server = applicationContext.getBean(EmbeddedServer.class).start();

    PetClient client = applicationContext.getBean(PetOperations.class);


    def 'test' (){
        given: 'name and age'

        when:
        client.save("Hoppie", 1);

        then:
        noExceptionThrown()
    }
}

然而,在调用PetClient的最后,我也尝试了@Factory注释,但没有成功

PetClient扩展了PetOperations,PetDummy实现了PetOperations,如果它们都实现了,那么使用@Replaces将是有意义的。。。

还有什么我可以试试的吗?

非常感谢。

另一个问题:

既然它工作了,PetClient就是我的PetService中的一个依赖项。当我测试PetService时,它仍然调用PetClient而不是PetDummy。

我假设它与applicationContext有关,您将看到

宠物服务:

PetService {
    @Inject
    PetClient client;

    buyFood(){
        //...
        Single<Pet> pet = client.save("Hoppie", 1));
    }
}

运行试验:

class PetServiceTest extends ApplicationContextSpecification {

    @Subject
    @Shared
    PetService petService = applicationContext.getBean(PetService)

    PetOperations client = applicationContext.getBean(PetOperations.class) //client is not used here

    def 'test' (){
        given:

        when:
        petService.buyFood()

        then:
        noExceptionThrown()
    }
}

我认为我需要从PetService中“进入”应用上下文,告诉“使用PetDummy”实现(在测试类内部,因为应用上下文规范属于另一个模块

应用内容规范是:

abstract class ApplicationContextSpecification extends Specification implements ConfigurationFixture {

    @AutoCleanup
    @Shared
    ApplicationContext applicationContext = ApplicationContext.run(configuration)

/*    def cleanup() {
        assert !hasLeakage()
    }*/

}

ConfigurationFixture包含数据库的属性(hibernate)

共有1个答案

孔志强
2023-03-14

您已经在检索PetClientbean实现:

PetClient client = applicationContext.getBean(PetOperations.class);

如果使用适当的类型调用,则应提供替换虚拟bean实现:

PetOperations client = applicationContext.getBean(PetOperations.class);
 类似资料:
  • 我正在发送一个请求到一个服务器,它给了我一个200,没有身体(完全可以接受),但是我无法解决如何配置micronaut注释来处理这个问题。无论我尝试什么,它都试图将空响应解码为JSON(至少我认为这是它正在做的,因为它给出了一个意想不到的错误,而不是当身体出错时得到的正常杰克逊错误)。我在微型文档中找不到任何关于如何做到这一点的东西。

  • 我希望能够使用Micronaut的声明性客户端,根据我是在本地开发环境还是在生产环境中,找到不同的endpoint。 我在中设置客户端的基本uri: 阅读来自Micronaut的文档,他们让开发人员跳过了相当多的障碍,将动态值输入到实际客户端。它们实际上很混乱。所以我创建了这样的配置: 但是正如您所看到的,这实际上并不是从中读取任何值,它只是将const值设置为类的静态值。我希望值根据我所处的环境

  • Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插入注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并使用Spring Web中默认使用的HttpMessageConverters。Spring Cloud集成Ri

  • 我有一个声明式客户端: 我已使用以下命令将客户端超时设置为30秒: 我随机得到: 这种令人讨厌的行为的原因是什么?

  • 尝试使用Micronaut声明性客户端上传多个文件。 http客户端 将多个文件添加到多部分 产品控制器 例外

  • 当我为我的Micronaut声明性客户端自动连接客户端接口时,我得到这个错误: 正确的方法是什么? 详细资料 我有一个已建立的Grails应用程序,最近我从3升级了它。x到4.0.1。 这个应用程序有一个并行执行多个REST调用的服务,我正在尝试添加一个使用新Micronaut HTTP声明性客户端的新REST调用。 我将客户端库添加到中的: 我的客户端界面如下(在中): 我在中配置了URL: 关