Совместимость Spring Cloud Stream и аннотации @Publisher - PullRequest
0 голосов
/ 11 января 2019

Поскольку Spring Cloud Stream не имеет аннотации для отправки нового сообщения в поток (@SendTo работает только при объявлении @StreamListener), я попытался использовать для этой цели аннотацию Spring Integration, то есть @ Publisher.

Поскольку @Publisher берет канал, а аннотации Spring Cloud Stream @EnableBinding могут связывать выходной канал с помощью аннотации @Output, я попытался смешать их следующим образом:

@EnableBinding(MessageSource.class)
@Service
public class ExampleService {

    @Publisher(channel = MessageSource.OUTPUT)
    public String sendMessage(String message){
        return message;
    }
}

Кроме того, я объявил аннотацию @EnablePublisher в файле конфигурации:

@SpringBootApplication
@EnablePublisher("")
public class ExampleApplication {

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

Мой тест:

@RunWith(SpringRunner.class)
@SpringBootTest
public class ExampleServiceTest {

    @Autowired
    private ExampleService exampleService;

    @Test
    public void testQueue(){
        exampleService.queue("Hi!");
        System.out.println("Ready!");
    }
}

Но я получаю следующую ошибку:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.example.ExampleServiceTest': Unsatisfied dependency expressed through field 'exampleService'; nested exception is 
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'exampleService' is expected to be of type 'com.example.ExampleService' but was actually of type 'com.sun.proxy.$Proxy86'

Проблема здесь в том, что bean-компонент ExampleService не может быть внедрен.

Кто-нибудь знает, как я могу заставить эту работу?

Спасибо!

1 Ответ

0 голосов
/ 11 января 2019

Поскольку вы используете аннотацию @Publisher в ExampleService, она проксируется для этого материала публикации.

Единственный способ решить эту проблему - открыть интерфейс для вашего ExampleService и добавить его уже в ваш тестовый класс:

public interface ExampleServiceInterface {

     String sendMessage(String message);

}

...

public class ExampleService implements ExampleServiceInterface {

...


@Autowired
private ExampleServiceInterface exampleService;

С другой стороны, похоже, что ваш ExampleService.sendMessage() ничего не делает с сообщением, поэтому вы можете вместо этого использовать @MessagingGateway на некотором интерфейсе: https://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#gateway

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...