我正在使用Springboot尝试一个简单的应用程序。
这是我的 Application.java 类
@SpringBootApplication
public class Application {
@Autowired(required=true)
private Listener listener;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@PostConstruct
public void initialize() {
SQS sqs = new SQS();
sqs.init();
sqs.createQueue("myQueue");
listener.run();
}
}
这是我的 UserController.java
@Controller
public class UserController {
@Autowired
private UserDao userDao;
@RequestMapping(value = "/findall", method = RequestMethod.GET)
public ModelAndView getAll(@RequestParam(value = "status", required=false) String status, Model model) {
Iterable<User> users = userDao.findAll();
ModelAndView mav = new ModelAndView("findall");
model.addAttribute("userobj",new User());
mav.addObject("users", users);
mav.addObject("status",status);
return mav;
}
@RequestMapping (value = "edit", method = RequestMethod.POST, params="action=ADD")
{
public String saveUser(@ModelAttribute UserDto userDto) {
try {
if(userDto.getId() != null) {
throw new UserExists();
}
SQS.sendMessage(userDto);
return "redirect:findall?status=success";
} catch (Exception e) {
System.err.println("Error Saving User");
e.printStackTrace();
return "redirect:findall?status=failure";
}
}
现在的问题是,当我在初始化方法上使用 @PostConstruct 时,我的Controller没有注册(即当我尝试点击我找不到页面的URL时)。
当我尝试删除 @PostConstruct 时,它可以正常工作。但我需要initialize()来运行()监听器(我为编写从队列中读取消息而编写的另一个可运行的类)
我尝试调整Application类,我不需要 @PostConstruct ,但它不起作用。
以下是我尝试使用 Application.java 类:
@SpringBootApplication
public class Application {
@Autowired(required=true)
private static Listener listener;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
initialize();
}
public static void initialize() {
SQS sqs = new SQS();
sqs.init();
sqs.createQueue("myQueue");
listener.run();
}
}
在这种情况下, @Controller正常工作。 但 私有静态侦听器侦听器的 @Autowiring ; 失败并抛出NullPointerException。
所以任何人都可以告诉我一个解决方法,以便以下两个工作。
答案 0 :(得分:0)
您需要使用Spring Cloud AWS库并使用以下注释注册SQS端点侦听器:
@SqsListener("${cloud.aws.sqs.queue.name}")
我建议为这个SQS监听器创建一个单独的@Component类,主要的Application类不适合这样的东西。