1. 注意在Encoder、Decoder、Handler中使用注入
@Resource
private AuthHandler authHandle
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringDecoder());
ch.pipeline().addLast(new NtripDecode());
ch.pipeline().addLast(authHandler);
}
})
在ch.pipeline().addLast的时候,里面填入的参数不能是交给Spring管理的类,因为每次连接过来时,都需要重新new,因此该类中的参数也无法使用@Autowired与@Resouce这类注解。
若采用以上的方式,就会报以下错误:
io.netty.channel.ChannelPipelineException: com.cnostar.cloud.gateway.ntrip.handler.AuthHandler is not a @Sharable handler, so can't be added or removed multiple times.
若需要在这些类中需要使用到注入的参数怎么办,可以采用类似以下方式,用一个静态类进行管理:
@Configuration
public class SpringBeanManager {
private static AuthFeignService authFeignService;
@Autowired
public void setAuthFeignService(AuthFeignService authFeignService) {
SpringBeanManager.authFeignService = authFeignService;
}
public static AuthFeignService getAuthFeignService() {
return authFeignService;
}
}