2016-02-19 81 views
0

我正在使用Spring Boot和MongoDB構建一個Web應用程序,它將簡單地爲員工文檔執行CRUD操作。Spring引導 - 不支持請求方法'POST'。嘗試了一切

我在嘗試使用json創建員工端點時遇到此錯誤"Request method 'POST' not supported"

我的控制器類是:

@RestController 
@RequestMapping("/employeeapp/employees") 
public class EmployeeController { 

    private final EmployeeService service; 

    @Autowired 
    public EmployeeController(EmployeeService service) { 
     this.service = service; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    @ResponseStatus(HttpStatus.CREATED) 
    public 
    @ResponseBody 
    Employee create(@RequestBody @Valid Employee employeeEntry) { 
     return service.create(employeeEntry); 
    } 

    @RequestMapping(value = "{id}", method = RequestMethod.DELETE) 
    public Employee delete(@PathVariable("id") long id) { 
     return service.delete(id); 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public List<Employee> findAll() { 
     return service.findAll(); 
    } 

    @RequestMapping(value = "{id}", method = RequestMethod.GET) 
    public Employee findById(@PathVariable("id") long id) { 
     return service.findById(id); 
    } 

    @RequestMapping(value = "{id}", method = RequestMethod.PUT) 
    public Employee update(@RequestBody @Valid Employee employeeEntry) { 
     return service.update(employeeEntry); 
    } 

    @ExceptionHandler 
    @ResponseStatus(HttpStatus.NOT_FOUND) 
    public void handleEmployeeNotFound(EmployeeNotFoundException exception) { 
    } 

} 

應用類:

@SpringBootApplication 
public class Application { 
    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class, args); 
    } 
} 

我已經試過禁用csrf,增加對方法@ResponseBody,但似乎沒有任何工作。

編輯

我打http://localhost:8080/employeeapp/employees與POST請求。該頭包括Content-Type : application/json以及與此JSON在身:

{ 
    "id" : 1, 
    "name" : "nikhil", 
    "dept" : "DCX" 
} 

而且,這是我在日誌中看到,當我擊中POST請求上述URL。

2016-02-19 12:21:36.549 INFO 5148 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]  : 
Initializing Spring FrameworkServlet 'dispatcherServlet' 
2016-02-19 12:21:36.549 INFO 5148 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet  : 
FrameworkServlet 'dispatcherServlet': initialization started 
2016-02-19 12:21:36.562 INFO 5148 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet  : 
FrameworkServlet 'dispatcherServlet': initialization completed in 13 ms 
2016-02-19 12:21:36.595 WARN 5148 --- [nio-8080-exec-1] o.s.web.servlet.PageNotFound    : 
Request method 'POST' not supported 

編輯2:

我查了春天啓動日誌,原來不被生成的映射,而是春天是映射到默認服務。任何想法爲什麼它可能會發生?

[INFO] --- spring-boot-maven-plugin:1.3.2.RELEASE:run (default-cli) @ EmployeeApp --- 

    . ____   _   __ _ _ 
/\\/___'_ __ _ _(_)_ __ __ _ \ \ \ \ 
(()\___ | '_ | '_| | '_ \/ _` | \ \ \ \ 
\\/ ___)| |_)| | | | | || (_| | )))) 
    ' |____| .__|_| |_|_| |_\__, |//// 
=========|_|==============|___/=/_/_/_/ 
:: Spring Boot ::  (v1.3.2.RELEASE) 

2016-02-19 14:51:00.690 INFO 5080 --- [   main] app.Application       : Starting Application on DIN16003277 with PID 5080 (D:\!Nikhil\Documents\Code\EmployeeApp\target\classes started by nvibhav in D:\!Nikhil\Documents\Code\EmployeeApp) 
2016-02-19 14:51:00.693 INFO 5080 --- [   main] app.Application       : No active profile set, falling back to default profiles: default 
2016-02-19 14:51:00.770 INFO 5080 --- [   main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot[email protected]46117566: startup date [Fri Feb 19 14:51:00 IST 2016]; root of context hierarchy 
2016-02-19 14:51:01.987 INFO 5080 --- [   main] o.s.b.f.s.DefaultListableBeanFactory  : Overriding bean definition for bean 'beanNameViewResolver' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]] 
2016-02-19 14:51:02.567 INFO 5080 --- [   main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring 
2016-02-19 14:51:03.026 INFO 5080 --- [   main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http) 
2016-02-19 14:51:03.037 INFO 5080 --- [   main] o.apache.catalina.core.StandardService : Starting service Tomcat 
2016-02-19 14:51:03.039 INFO 5080 --- [   main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.30 
2016-02-19 14:51:03.172 INFO 5080 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]  : Initializing Spring embedded WebApplicationContext 
2016-02-19 14:51:03.173 INFO 5080 --- [ost-startStop-1] o.s.web.context.ContextLoader   : Root WebApplicationContext: initialization completed in 2409 ms 
2016-02-19 14:51:03.689 INFO 5080 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'metricFilter' to: [/*] 
2016-02-19 14:51:03.689 INFO 5080 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 
2016-02-19 14:51:03.690 INFO 5080 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 
2016-02-19 14:51:03.690 INFO 5080 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 
2016-02-19 14:51:03.690 INFO 5080 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 
2016-02-19 14:51:03.691 INFO 5080 --- [ost-startStop-1] .e.DelegatingFilterProxyRegistrationBean : Mapping filter: 'springSecurityFilterChain' to: [/*] 
2016-02-19 14:51:03.691 INFO 5080 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'webRequestLoggingFilter' to: [/*] 
2016-02-19 14:51:03.691 INFO 5080 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'applicationContextIdFilter' to: [/*] 
2016-02-19 14:51:03.692 INFO 5080 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/] 
2016-02-19 14:51:04.011 INFO 5080 --- [ost-startStop-1] b.a.s.AuthenticationManagerConfiguration : 

Using default security password: c652ec29-f926-40eb-bb5b-2bd9185bf6a5 

2016-02-19 14:51:04.075 INFO 5080 --- [ost-startStop-1] o.s.s.web.DefaultSecurityFilterChain  : Creating filter chain: OrRequestMatcher [requestMatchers=[Ant [pattern='/css/**'], Ant [pattern='/js/**'], Ant [pattern='/images/**'], Ant [pattern='/**/favicon.ico'], Ant [pattern='/error']]], [] 
2016-02-19 14:51:04.141 INFO 5080 --- [ost-startStop-1] o.s.s.web.DefaultSecurityFilterChain  : Creating filter chain: [email protected]1, [org.springframework.secu[email protected]71d64e0f, org.spring[email protected]68e32d1f, [email protected]3e4, org.[email protected]6a766ce6, org.sp[email protected]3111b148, org.springframework.[email protected]75e89f1f, org.springfram[email protected]289e0d8f, o[email protected]4ec4999b, org[email protected]3f4e33f9] 
2016-02-19 14:51:04.181 INFO 5080 --- [ost-startStop-1] o.s.s.web.DefaultSecurityFilterChain  : Creating filter chain: org.springframework.boot.actuate.autoconfigure.Manage[email protected]7f2a96e1, [org.springframework.secu[email protected]3ae13235, org.spring[email protected]5f36bdc8, [email protected]520, org.[email protected]1ce1dc64, org.springfram[email protected]51a29584, org.sp[email protected]120723a8, org.springframework.[email protected]b2632d, org.springfram[email protected]49cabfed, o[email protected]6c8e082f, org[email protected]51f381ff, org.springfr[email protected]3b3223fd] 
2016-02-19 14:51:04.399 INFO 5080 --- [   main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot[email protected]46117566: startup date [Fri Feb 19 14:51:00 IST 2016]; root of context hierarchy 
2016-02-19 14:51:04.471 INFO 5080 --- [   main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 
2016-02-19 14:51:04.472 INFO 5080 --- [   main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 
2016-02-19 14:51:04.506 INFO 5080 --- [   main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 
2016-02-19 14:51:04.506 INFO 5080 --- [   main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 
2016-02-19 14:51:04.549 INFO 5080 --- [   main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 
2016-02-19 14:51:04.720 INFO 5080 --- [   main] org.mongodb.driver.cluster    : Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500} 
2016-02-19 14:51:04.844 INFO 5080 --- [localhost:27017] org.mongodb.driver.connection   : Opened connection [connectionId{localValue:1, serverValue:5}] to localhost:27017 
2016-02-19 14:51:04.845 INFO 5080 --- [localhost:27017] org.mongodb.driver.cluster    : Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 2, 1]}, minWireVersion=0, maxWireVersion=4, maxDocumentSize=16777216, roundTripTimeNanos=565904} 
2016-02-19 14:51:05.243 INFO 5080 --- [   main] o.s.b.a.e.mvc.EndpointHandlerMapping  : Mapped "{[/autoconfig || /autoconfig.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 
2016-02-19 14:51:05.244 INFO 5080 --- [   main] o.s.b.a.e.mvc.EndpointHandlerMapping  : Mapped "{[/env/{name:.*}],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpoint.value(java.lang.String) 
2016-02-19 14:51:05.244 INFO 5080 --- [   main] o.s.b.a.e.mvc.EndpointHandlerMapping  : Mapped "{[/env || /env.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 
2016-02-19 14:51:05.245 INFO 5080 --- [   main] o.s.b.a.e.mvc.EndpointHandlerMapping  : Mapped "{[/configprops || /configprops.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 
2016-02-19 14:51:05.247 INFO 5080 --- [   main] o.s.b.a.e.mvc.EndpointHandlerMapping  : Mapped "{[/metrics/{name:.*}],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint.value(java.lang.String) 
2016-02-19 14:51:05.247 INFO 5080 --- [   main] o.s.b.a.e.mvc.EndpointHandlerMapping  : Mapped "{[/metrics || /metrics.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 
2016-02-19 14:51:05.250 INFO 5080 --- [   main] o.s.b.a.e.mvc.EndpointHandlerMapping  : Mapped "{[/mappings || /mappings.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 
2016-02-19 14:51:05.251 INFO 5080 --- [   main] o.s.b.a.e.mvc.EndpointHandlerMapping  : Mapped "{[/health || /health.json],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint.invoke(java.security.Principal) 
2016-02-19 14:51:05.251 INFO 5080 --- [   main] o.s.b.a.e.mvc.EndpointHandlerMapping  : Mapped "{[/trace || /trace.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 
2016-02-19 14:51:05.252 INFO 5080 --- [   main] o.s.b.a.e.mvc.EndpointHandlerMapping  : Mapped "{[/beans || /beans.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 
2016-02-19 14:51:05.252 INFO 5080 --- [   main] o.s.b.a.e.mvc.EndpointHandlerMapping  : Mapped "{[/info || /info.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 
2016-02-19 14:51:05.253 INFO 5080 --- [   main] o.s.b.a.e.mvc.EndpointHandlerMapping  : Mapped "{[/dump || /dump.json],methods=[GET],produces=[application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke() 
2016-02-19 14:51:05.377 INFO 5080 --- [   main] o.s.j.e.a.AnnotationMBeanExporter  : Registering beans for JMX exposure on startup 
2016-02-19 14:51:05.391 INFO 5080 --- [   main] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 0 
2016-02-19 14:51:05.561 INFO 5080 --- [   main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 
2016-02-19 14:51:05.567 INFO 5080 --- [   main] app.Application       : Started Application in 5.207 seconds (JVM running for 11.036) 
+0

這時候你打與POST請求的URL發生,你沒有相應的映射在控制器,URL 。使用POST請求打什麼URL?請提供相關問題 –

+0

您確定您要訪問的請求正文和網址是否正確?你也可以嘗試添加'@ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity handleBadInput(HttpMessageNotReadableException ex){ Throwable cause = ex.getCause();'給你的類檢查輸入是否有問題。你是否在控制檯中發現任何其他錯誤? – Gyan

+0

您要調用哪個URL以及您的應用程序映射了哪個URL。看起來你的映射網址是錯誤的,它包含了'DispatcherServlet'或應用程序名稱的映射。 –

回答

4

以下可能有所幫助。

  1. 在部署應用程序時,spring啓動顯示控制檯上所有可用的服務 。檢查POST方法以創建 正在顯示與否。檢查是否與其他服務不存在矛盾。 GET/PUT/POST
  2. 如果沒有部署服務,請嘗試在其他服務之前添加'/' - GET,PUT,POST。
  3. 添加異常處理程序(link)以檢查客戶端輸入請求以檢查POJO結構。
  4. 檢查URL - 如果添加 配置應用程序/名稱的任何全局路徑(link
  5. 嘗試刪除頭 - 在Content-Type請求頭和後 請求再次

以下是可能發生的不同事情。不需要按順序進行。

編輯:

運行以下命令,檢查您的控制器是否被啓用,通過彈簧的應用程序或不考慮。

import java.util.Arrays; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.ApplicationContext; 

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(Application.class, args); 

     System.out.println("Let's inspect the beans provided by Spring Boot:"); 

     String[] beanNames = ctx.getBeanDefinitionNames(); 
     Arrays.sort(beanNames); 
     for (String beanName : beanNames) { 
      System.out.println(beanName); 
     } 
    } 

    } 
+0

所以事實證明,spring-boot並沒有將url映射到服務。在上面的帖子中添加日誌。 –

+0

「日誌」是在部署期間還是在請求期間? – VinayVeluri

+1

最近的回覆,但我被捲入工作。是的,事實證明包裝結構是錯誤的。早些時候,我在'src/java'子目錄下有我的代碼。現在,將它們添加到'com.nikhil.practice'下並且工作。 –

2

如果@SpringBootApplication註釋的類和控制器在不同的包中,它不會在默認的類掃描中選擇它。

它幾乎適用於所有演示,因爲bootstrapping類(@SpringBootApplication註釋類)和其他控制器類駐留在同一個包中並加載到spring上下文中。

//讓您的類訪問到春天喜歡這樣

@SpringBootApplication(scanBasePackages = {"com.tryout"}) 
public class BootPocApplication { 
+0

是的,@ThusharaAriyasena。我想到幾個月前。無論如何,感謝您的幫助:) –

0

對我來說,當我用@RequestParam這個錯誤發生此

@SpringBootApplication(scanBasePackageClasses = {GreetingController.class}) 
public class BootPocApplication { 

OR //給基本包名稱方法定義中的

@RequestMapping(value = "/balance",method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE) 
    public FinancialMsgResponse balance(@RequestParam(value = "requestMessage") FinancialMsgRequest requestMessage) throws Exception { 

     return new FinancialMsgResponse(); 
    } 

所以當我刪除@RequestParam錯誤

請求方法 'POST' 不支持

的消失。

好運

0

您可能需要修改jar在包裝war

<groupId>com.example</groupId> 
<artifactId>demo</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>war</packaging> 
相關問題