在initialize()上使用@PostConstruct后,我的@Controller没有被注册

时间:2016-08-18 10:53:53

标签: java spring-boot controller autowired

我正在使用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。

所以任何人都可以告诉我一个解决方法,以便以下两个工作。

  1. @Autowired(所需=真) private Listener listener; - &GT;得到自动装配,所以我将能够运行()它
  2. 我的Controller API已注册,因此我可以点击URL

1 个答案:

答案 0 :(得分:0)

您需要使用Spring Cloud AWS库并使用以下注释注册SQS端点侦听器:

@SqsListener("${cloud.aws.sqs.queue.name}")

我建议为这个SQS监听器创建一个单独的@Component类,主要的Application类不适合这样的东西。

这是Spring Cloud AWS guide