Redis - 考虑重命名其中一个 bean 或通过设置 spring.main.allow-bean-definition-overriding=true 启用覆盖
Redis - Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
我正在开发 Spring Boot + Spring Data Redis
示例。在此示例中,我正在为 RedisMessageListenerContainer
开发代码并在此处定义相应的 bean。
现在,当我 运行 应用程序时,出现以下错误。有人可以指导我是什么问题吗?
***************************
APPLICATION FAILED TO START
***************************
Description:
The bean 'redisMessageListenerContainer', defined in class path resource [org/springframework/boot/autoconfigure/session/RedisSessionConfiguration$SpringBootRedisHttpSessionConfiguration.class], could not be registered. A bean with that name has already been defined in com.example.RedisApplication and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
RedisApplication.java
@Log
@SpringBootApplication
public class RedisApplication {
@Autowired
private OrderRepository orderRepository;
@Autowired
private LineItemRepository lineItemRepository;
private ApplicationRunner titleRunner(String title, ApplicationRunner rr) {
return args -> {
log.info(title.toUpperCase() + ":");
rr.run(args);
};
}
@Bean
ApplicationRunner geography(RedisTemplate<String, String> rt) {
return titleRunner("geography", args -> {
GeoOperations<String, String> geo = rt.opsForGeo();
geo.add("Sicily", new Point(13.361389, 38.155556), "Arigento");
geo.add("Ramesh", new Point(15.087269, 37.502669), "Catania");
geo.add("Anup", new Point(13.583333, 37.316667), "Palermo");
Circle circle = new Circle(new Point(13.583333, 37.316667),
new Distance(100, RedisGeoCommands.DistanceUnit.KILOMETERS));
GeoResults<GeoLocation<String>> radius = geo.radius("Sicily", circle);
radius.getContent().forEach(c -> log.info(c.toString()));
});
}
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class, args);
}
@Bean
ApplicationRunner repositories() {
return titleRunner("repositories", args -> {
Long orderId = generateId();
List<LineItem> itemsList = Arrays.asList(
new LineItem(orderId, generateId(), "plunger"),
new LineItem(orderId, generateId(), "soup"),
new LineItem(orderId, generateId(), "cofee mug"));
itemsList.stream().map(lineItemRepository::save).forEach(li -> log.info(li.toString()));
Order order = new Order(orderId, new Date(), itemsList);
orderRepository.save(order);
Collection<Order> found = orderRepository.findByWhen(order.getWhen());
found.forEach(o -> log.info("found : " + o.toString()));
});
}
private Long generateId() {
long tmp = new Random().nextLong();
return Math.max(tmp, tmp * -1);
}
private final String TOPIC = "Chat";
@Bean
ApplicationRunner pubSub(RedisTemplate<String, String> rt) {
return titleRunner("publish/subscribe", args ->{
rt.convertAndSend(TOPIC, "Hello World @ "+Instant.now().toString());
});
}
@Bean
RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory rcf) {
MessageListener ml = (message, pattern) -> {
String str = new String(message.getBody());
log.info("message from ' " + TOPIC + "':'" + str);
};
RedisMessageListenerContainer mlc = new RedisMessageListenerContainer();
mlc.setConnectionFactory(rcf);
mlc.addMessageListener(ml, new PatternTopic(TOPIC));
return mlc;
}
}
我不确定这是否是一个错误,但如果您提供 redisMessageListenerContainer
以外的任何名称,即 Spring 将考虑 bean 名称,那么它可以正常工作。
@Bean
RedisMessageListenerContainer listener(RedisConnectionFactory rcf) {
MessageListener ml = (message, pattern) -> {
String str = new String(message.getBody());
log.info("message from ' " + TOPIC + "':'" + str);
};
RedisMessageListenerContainer mlc = new RedisMessageListenerContainer();
mlc.setConnectionFactory(rcf);
mlc.addMessageListener(ml, new PatternTopic(TOPIC));
return mlc;
}
您可以通过添加(至少在我的示例中)实现错误消息中建议的更改
spring.main.allow-bean-definition-overriding=true
到 "application.properties" 文件。在我的例子中(一台 windows 机器)
\gs-actuator-service\basewebcall\src\main\resources\application.属性
当同一个项目中有两个用@SpringBootApplication 注释的java 文件时,我就遇到了这种情况。根据日志中的消息,默认情况下不允许这样做,并要求我们在 application.properties 中包含 属性 以启用它。希望这有帮助。
application.yml
spring:
main:
allow-bean-definition-overriding: true
application.properties
spring.main.allow-bean-definition-overriding=true
我正在开发 Spring Boot + Spring Data Redis
示例。在此示例中,我正在为 RedisMessageListenerContainer
开发代码并在此处定义相应的 bean。
现在,当我 运行 应用程序时,出现以下错误。有人可以指导我是什么问题吗?
***************************
APPLICATION FAILED TO START
***************************
Description:
The bean 'redisMessageListenerContainer', defined in class path resource [org/springframework/boot/autoconfigure/session/RedisSessionConfiguration$SpringBootRedisHttpSessionConfiguration.class], could not be registered. A bean with that name has already been defined in com.example.RedisApplication and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
RedisApplication.java
@Log
@SpringBootApplication
public class RedisApplication {
@Autowired
private OrderRepository orderRepository;
@Autowired
private LineItemRepository lineItemRepository;
private ApplicationRunner titleRunner(String title, ApplicationRunner rr) {
return args -> {
log.info(title.toUpperCase() + ":");
rr.run(args);
};
}
@Bean
ApplicationRunner geography(RedisTemplate<String, String> rt) {
return titleRunner("geography", args -> {
GeoOperations<String, String> geo = rt.opsForGeo();
geo.add("Sicily", new Point(13.361389, 38.155556), "Arigento");
geo.add("Ramesh", new Point(15.087269, 37.502669), "Catania");
geo.add("Anup", new Point(13.583333, 37.316667), "Palermo");
Circle circle = new Circle(new Point(13.583333, 37.316667),
new Distance(100, RedisGeoCommands.DistanceUnit.KILOMETERS));
GeoResults<GeoLocation<String>> radius = geo.radius("Sicily", circle);
radius.getContent().forEach(c -> log.info(c.toString()));
});
}
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class, args);
}
@Bean
ApplicationRunner repositories() {
return titleRunner("repositories", args -> {
Long orderId = generateId();
List<LineItem> itemsList = Arrays.asList(
new LineItem(orderId, generateId(), "plunger"),
new LineItem(orderId, generateId(), "soup"),
new LineItem(orderId, generateId(), "cofee mug"));
itemsList.stream().map(lineItemRepository::save).forEach(li -> log.info(li.toString()));
Order order = new Order(orderId, new Date(), itemsList);
orderRepository.save(order);
Collection<Order> found = orderRepository.findByWhen(order.getWhen());
found.forEach(o -> log.info("found : " + o.toString()));
});
}
private Long generateId() {
long tmp = new Random().nextLong();
return Math.max(tmp, tmp * -1);
}
private final String TOPIC = "Chat";
@Bean
ApplicationRunner pubSub(RedisTemplate<String, String> rt) {
return titleRunner("publish/subscribe", args ->{
rt.convertAndSend(TOPIC, "Hello World @ "+Instant.now().toString());
});
}
@Bean
RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory rcf) {
MessageListener ml = (message, pattern) -> {
String str = new String(message.getBody());
log.info("message from ' " + TOPIC + "':'" + str);
};
RedisMessageListenerContainer mlc = new RedisMessageListenerContainer();
mlc.setConnectionFactory(rcf);
mlc.addMessageListener(ml, new PatternTopic(TOPIC));
return mlc;
}
}
我不确定这是否是一个错误,但如果您提供 redisMessageListenerContainer
以外的任何名称,即 Spring 将考虑 bean 名称,那么它可以正常工作。
@Bean
RedisMessageListenerContainer listener(RedisConnectionFactory rcf) {
MessageListener ml = (message, pattern) -> {
String str = new String(message.getBody());
log.info("message from ' " + TOPIC + "':'" + str);
};
RedisMessageListenerContainer mlc = new RedisMessageListenerContainer();
mlc.setConnectionFactory(rcf);
mlc.addMessageListener(ml, new PatternTopic(TOPIC));
return mlc;
}
您可以通过添加(至少在我的示例中)实现错误消息中建议的更改
spring.main.allow-bean-definition-overriding=true 到 "application.properties" 文件。在我的例子中(一台 windows 机器)
\gs-actuator-service\basewebcall\src\main\resources\application.属性
当同一个项目中有两个用@SpringBootApplication 注释的java 文件时,我就遇到了这种情况。根据日志中的消息,默认情况下不允许这样做,并要求我们在 application.properties 中包含 属性 以启用它。希望这有帮助。
application.yml
spring:
main:
allow-bean-definition-overriding: true
application.properties
spring.main.allow-bean-definition-overriding=true