[SPRING] 415 지원되지 않는 Spring 어플리케이션의 POST 요청 용 MediaType
SPRING415 지원되지 않는 Spring 어플리케이션의 POST 요청 용 MediaType
나는 아주 간단한 스프링 어플리케이션 (스프링 부트 아님)을 가지고있다. GET 및 POST 컨트롤러 메서드를 구현했습니다. GET 메서드를 잘 작동합니다. 하지만 POST는 415 Unsupported MediaType을 던지고 있습니다. 재현 단계는 아래에서 확인할 수 있습니다.
ServiceController. 자바
package com.example.myApp.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/service/example")
public class ServiceController {
@RequestMapping(value="sample", method = RequestMethod.GET)
@ResponseBody
public String getResp() {
return "DONE";
}
@RequestMapping(value="sample2", method = RequestMethod.POST, consumes = "application/json")
@ResponseBody
public String getResponse2(@RequestBody Person person) {
return "id is " + person.getId();
}
}
class Person {
private int id;
private String name;
public Person(){
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
AppConfig.java
package com.example.myApp.app.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
@EnableWebMvc
@ComponentScan("com.example.myApp")
public class AppConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/test/**").addResourceLocations("/test/").setCachePeriod(0);
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(0);
registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(0);
registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(0);
}
}
AppInitializer.java
package com.example.myApp.app.config;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
public class AppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
// Create the 'root' Spring application context
AnnotationConfigWebApplicationContext rootContext =
new AnnotationConfigWebApplicationContext();
rootContext.register(AppConfig.class);
servletContext.addListener(new ContextLoaderListener(rootContext));
// Register and map the dispatcher servlet
ServletRegistration.Dynamic dispatcher =
servletContext.addServlet("dispatcher", new DispatcherServlet(rootContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
코드는 다음에서 사용할 수 있습니다.
git clone https://bitbucket.org/SpringDevSeattle/springrestcontroller.git
./gradlew clean build tomatrunwar
이것은 포함 된 바람둥이를 회전시킵니다.
이제 다음과 같이 말릴 수 있습니다.
curl -X GET -H "Content-Type: application/json" "http://localhost:8095/myApp/service/example/sample"
잘 작동합니다.
그러나
curl -X POST -H "Content-Type: application/json" '{
"id":1,
"name":"sai"
}' "http://localhost:8095/myApp/service/example/sample2"
지원되지 않는 미디어 유형 415가 발생합니다.
<body>
<h1>HTTP Status 415 - </h1>
<HR size="1" noshade="noshade">
<p>
<b>type</b> Status report
</p>
<p>
<b>message</b>
<u></u>
</p>
<p>
<b>description</b>
<u>The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.</u>
</p>
<HR size="1" noshade="noshade">
<h3>Apache Tomcat/7.0.54</h3>
</body>
해결법
-
==============================
1.해결책을 찾았으니 다른 사람들에게 도움이되도록 여기에 게시하고 싶습니다.
해결책을 찾았으니 다른 사람들에게 도움이되도록 여기에 게시하고 싶습니다.
첫째로 나는 build.gradle에 다음과 같이 추가 한 클래스 패스에 jackson을 포함시켜야한다.
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.5' compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.5' compile 'com.fasterxml.jackson.core:jackson-core:2.7.5'
다음으로 WebMvcConfigurerAdapter를 확장 한 AppConfig를 다음과 같이 변경해야합니다.
@Configuration @EnableWebMvc @ComponentScan("com.example.myApp") public class AppConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/test/**").addResourceLocations("/test/").setCachePeriod(0); registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(0); registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(0); registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(0); } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new MappingJackson2HttpMessageConverter()); super.configureMessageConverters(converters); } }
그게 전부이고 모든 것이 멋지게 작동했습니다.
-
==============================
2.수락 헤더가 문제 일 수 있습니다. 지금까지 내가 기억하는 한, 당신이 컬을 통해 요청을 보낼 때 기본 헤더를 받아 들인다. * / * JSON의 경우 accept 헤더를 accept : application / json으로 언급해야합니다. 마찬가지로 content-Type을 언급했습니다.
수락 헤더가 문제 일 수 있습니다. 지금까지 내가 기억하는 한, 당신이 컬을 통해 요청을 보낼 때 기본 헤더를 받아 들인다. * / * JSON의 경우 accept 헤더를 accept : application / json으로 언급해야합니다. 마찬가지로 content-Type을 언급했습니다.
그리고 조금 더, 그게 뭔지 모르겠지만, 당신은 "요청 매핑"을 배치해야한다고 생각하지 않습니까?
@RequestMapping(value="/sample" ... @RequestMapping(value="/sample2" ...
이것은 사실이 아니지만 헤더를 수락하는 것이 중요하다고 생각합니다. 해결책 2 이 코드가 있으니
public String getResponse2(@RequestBody Person person)
나는 이미이 문제에 직면 해 있으며 해결책 2가 여기서 도움을 줄 수있다.
콘텐츠 형식이 application / x-www-form-urlencoded 일 때 @ RequestBody-annotated 매개 변수에 사용되는 FormHttpMessageConverter는 @ModelAttribute와 같이 대상 클래스를 바인딩 할 수 없습니다. 따라서 @RequestBody 대신 @ModelAttribute가 필요합니다.
@RequestBody 대신 @ModelAttribute 주석을 사용하십시오.
public String getResponse2(@ModelAttribute Person person)
나는 누군가에게 같은 대답을 주었다. 여기 내 대답이다.
-
==============================
3.curl에서 -d 옵션을 사용하여 시도 할 수 있습니까?
curl에서 -d 옵션을 사용하여 시도 할 수 있습니까?
curl -H "Content-Type: application/json" -X POST -d '{"id":"1,"name":"sai"}' http://localhost:8095/myApp/service/example/sample2
또한, 윈도우를 사용한다면 큰 따옴표를 피해야합니다.
-d "{ \"id\": 1, \"name\":\"sai\" }"
from https://stackoverflow.com/questions/38066591/415-unsupported-mediatype-for-post-request-in-spring-application by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 봄 - intum 문자열로 열거 형을 저장 / 검색하는 몽고 (0) | 2019.02.14 |
---|---|
[SPRING] 통합 테스트 케이스를 통한 스프링 부트, yml 속성 읽기 (0) | 2019.02.14 |
[SPRING] / api-url에는 스프링 부트 보안에 빈 필터 목록이 있습니다. (0) | 2019.02.14 |
[SPRING] 새 스프링 데이터 JDK8 Jsr310JpaConverters가 자동으로 작동하지 않습니까? (0) | 2019.02.14 |
[SPRING] URL 패턴을 기반으로 스프링 부트 필터를 적용하는 방법은 무엇입니까? (0) | 2019.02.14 |