복붙노트

[SPRING] Spring Cloud Stream 및 @Publisher 주석 호환성

SPRING

Spring Cloud Stream 및 @Publisher 주석 호환성

Spring Cloud Stream에는 새로운 메시지를 스트림에 보내는 주석이 없으므로 (@SendTo는 @StreamListener가 선언 될 때만 작동 함), @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'

문제는 ExampleService bean을 삽입 할 수 없다는 것입니다.

누구든지이 일을 어떻게 할 수 있는지 알고 있습니까?

감사!

해결법

  1. ==============================

    1.ExampleService에서 @Publisher 주석을 사용하기 때문에 게시 내용에 대해 프록시 처리됩니다.

    ExampleService에서 @Publisher 주석을 사용하기 때문에 게시 내용에 대해 프록시 처리됩니다.

    이 문제를 극복하는 유일한 방법은 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

  2. from https://stackoverflow.com/questions/54150939/spring-cloud-stream-and-publisher-annotation-compatiblity by cc-by-sa and MIT license