为什么Spring引导会返回404错误,但是如果我将所有控制器的所有方法都置于一个控制器类下,则可以正常工

时间:2017-10-07 23:33:09

标签: spring spring-mvc

当我尝试发送访问handleFileUpload( )方法的请求时出现404错误 但是,如果我将handleFileUpload( )置于DetailsController.java内,那么事情就会奏效。这是为什么?我正在使用Spring启动。 我有两个控制器类。 我没有ServletInitializer.java

com.amazon.s3  | __ AmazonS3Controller.java com.myproject  | __ DetailsController.java

这就是我的@SpringBootApplication类的样子

@SpringBootApplication //This annotation means, it is the starting point of the app. 
public class QqdApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(QqdApplication.class, args);
}

DetailsController.java

@RestController
@Component
public class DetailsController {

    @Autowired
    private DetailsService detailsService;

   @RequestMapping("/contactUs")
    public ModelAndView contactUs(){
        ModelAndView mav = new ModelAndView();
        mav.setViewName("contactUs");
        return mav;
    }    
}

AmazonS3Controller.java

package com.amazon.s3;

import com.amazon.s3.AmazonS3Template;
import com.amazonaws.services.s3.model.*;

import java.util.List;
import java.util.stream.Collectors;

import javax.servlet.annotation.MultipartConfig;

@RestController
@RequestMapping("/s")
public class AmazonS3Controller {

    private AmazonS3Template amazonS3Template;
    private String bucketName;

    @Autowired
    public AmazonS3Controller(AmazonS3Template amazonS3Template, @Value("${amazon.s3.default-bucket}") String bucketName) {
        this.amazonS3Template = amazonS3Template;
        this.bucketName = bucketName;
    }

  @PostMapping(value = "upload",  headers = "Accept=*/*")
  @ResponseBody
  public String handleFileUpload() {
      JSONObject result = new JSONObject();
      try {

  //      System.out.println("we ar ehere" + file.getName() + " " + file.getContentType() + " " + file.getSize());
        result.put("link", "https://static.swappa.com/static/icons/stars/star-on-small-green.png");
        System.out.println("imgae returned");
      } catch (JSONException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      }
      return new JSONArray().put(result).toString();    
  }
}

我的application.properties看起来像

spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp

#AWS details
amazon.s3.default-bucket=<someVal>

#Database
spring.datasource.....=....

#Hibernate
entitymanager.packagesToScan:com
spring.jpa.....=....

PS:好的,将com.amazon.s3重命名为com.myproject.s3之后,一切正常。但是,我仍然不明白为什么它之前没有工作以及为什么它现在正在工作。

P.S.S:我在这里输入以上三行而不是评论,因为SOF继续告诉我代码太多,文字少。对不起,我不能在这里写故事。我觉得我给了足够的细节。谢谢。

1 个答案:

答案 0 :(得分:0)

注释@SpringBootApplication包括@ComponentScan

  

@SpringBootApplication注释等同于使用   @Configuration,@ EnableAutoConfiguration和@ComponentScan与他们的   默认属性:

https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-using-springbootapplication-annotation.html

默认情况下,

@ComponentScan将从注释所在的类的包中扫描注释(即QqdApplication的包<)

  

如果未定义特定包,则会从中进行扫描   声明此批注的类的包。

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html

因此,当放置在包@PostMapping中的控制器中时,未捕获com.amazon.s3 to com.myproject.s3注释。您必须将软件包更改为扫描位置,或者您必须在@ComponentScan注释中指定要扫描的软件包。