2016-02-19 83 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> 
相关问题