POST JSON이 415 Unsupported media type, Spring 3 mvc로 실패합니다.
서블릿에 POST 요청을 보내려고 합니다.요청은 다음과 같이 jQuery를 통해 전송됩니다.
var productCategory = new Object();
productCategory.idProductCategory = 1;
productCategory.description = "Descrizione2";
newCategory(productCategory);
여기서 new Category는
function newCategory(productCategory)
{
$.postJSON("ajax/newproductcategory", productCategory, function(
idProductCategory)
{
console.debug("Inserted: " + idProductCategory);
});
}
및 포스트 JSON은
$.postJSON = function(url, data, callback) {
return jQuery.ajax({
'type': 'POST',
'url': url,
'contentType': 'application/json',
'data': JSON.stringify(data),
'dataType': 'json',
'success': callback
});
};
fire bug를 사용하면 JSON이 올바르게 전송되었음을 알 수 있습니다.
{"idProductCategory":1,"description":"Descrizione2"}
415 Unsupported media type이 표시됩니다.Spring MVC 컨트롤러에 시그니처가 있음
@RequestMapping(value = "/ajax/newproductcategory", method = RequestMethod.POST)
public @ResponseBody
Integer newProductCategory(HttpServletRequest request,
@RequestBody ProductCategory productCategory)
며칠 전에는 효과가 있었지만 지금은 그렇지 않다.필요한 경우 코드를 더 보여 드리겠습니다.
이전에 Spring @Response Body에서 이 문제가 발생한 적이 있는데, 요청과 함께 Accept 헤더가 전송되지 않았기 때문입니다.accept header를 jQuery로 설정하는 것은 번거로운 일이지만, 이 방법은 제 소스에 도움이 되었습니다.
$.postJSON = function(url, data, callback) {
return jQuery.ajax({
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
'type': 'POST',
'url': url,
'data': JSON.stringify(data),
'dataType': 'json',
'success': callback
});
};
Content-Type 헤더는 @RequestBody에서 요청 내 클라이언트에서 전송되는 데이터의 형식을 결정하기 위해 사용됩니다.accept 헤더는 @ResponseBody에서 응답 내의 클라이언트에 데이터를 반환할 형식을 결정하기 위해 사용됩니다.그래서 두 헤더가 모두 필요한 거예요.
, ""로 지정"application/json를
비슷한 문제가 있었지만 문제는 @RequestBody로 주석을 단 DTO 기본 컨스트럭터를 제공하지 않았다는 것입니다.
저도 비슷한 문제에 직면했고 이렇게 고쳤습니다.
이 문제는 JSON에서 Java로의 변환 프로세스에 기인하며 변환이 올바르게 이루어지려면 올바른 런타임 Jackson 라이브러리가 필요합니다.
종속성을 통해 또는 클래스 경로를 다운로드하여 추가하여 다음 jar를 추가합니다.
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
이것으로 문제가 해결됩니다.
완전한 코드:
function() {
$.ajax({
type: "POST",
url: "saveUserDetails.do",
data: JSON.stringify({
name: "Gerry",
ity: "Sydney"
}),
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
success: function(data) {
if (data.status == 'OK')
alert('Person has been added');
else
alert('Failed adding person: ' + data.status + ', ' + data.errorMessage);
}
컨트롤러 시그니처는 다음과 같습니다.
@RequestMapping(value = "/saveUserDetails.do", method = RequestMethod.POST)
public @ResponseBody Person addPerson( @RequestBody final Person person) {
도움이 되었으면 좋겠다
정확히 같은 문제에 부딪혔던 것 같아요.JSON, JavaScript 및 Server와 수없이 많은 시간 동안 싸운 끝에 범인을 찾았습니다.DTO에 Date 객체가 있는 경우 이 Date 객체가 String으로 변환되어 다음 형식으로 뷰에 표시할 수 있습니다.HH: 음.
JSON 정보가 반환될 때 이 Date String 객체는 완전한 Date 객체로 다시 변환되어야 하므로 DTO에서 설정하는 방법도 필요합니다.큰 문제는 DTO에 같은 이름(Overload)을 가진 2개의 메서드를 포함할 수 없다는 것입니다.이는 415 Unsupported Media type 에러가 발생하기 때문입니다.
이것이 컨트롤러 방식입니다.
@RequestMapping(value = "/alarmdownload/update", produces = "application/json", method = RequestMethod.POST)
public @ResponseBody
StatusResponse update(@RequestBody AlarmDownloadDTO[] rowList) {
System.out.println("hola");
return new StatusResponse();
}
DTO의 예를 다음에 나타냅니다(코드 단축에는 id get/set 및 pre Alarm get 메서드는 포함되지 않습니다).
@JsonIgnoreProperties(ignoreUnknown = true)
public class AlarmDownloadDTO implements Serializable {
private static final SimpleDateFormat formatHHmm = new SimpleDateFormat("HH:mm");
private String id;
private Date preAlarm;
public void setPreAlarm(Date date) {
this.preAlarm == date;
}
public void setPreAlarm(String date) {
try {
this.preAlarm = formatHHmm.parse(date);
} catch (ParseException e) {
this.preAlarm = null;
} catch (NullPointerException e){
this.preAlarm = null;
}
}
}
모든 것이 작동하려면 날짜 유형 매개 변수를 사용하여 메서드를 제거해야 합니다.이 오류는 매우 짜증납니다.이렇게 하면 디버깅 시간을 절약할 수 있습니다.
스프링 부츠를 스프링 MVC와 통합했을 때 이 문제에 직면했습니다.나는 단지 이러한 의존성을 더하는 것으로 그것을 해결했다.
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
작은 측면 메모 - 웹 어플리케이션 개발 중에 동일한 오류가 발생하였습니다.Firefox Poster를 사용하여 서비스를 조작한 결과, Json의 필드와 값이 모두 큰따옴표로 둘러싸야 한다는 것을 알게 되었습니다.예를 들면...
[ {"idProductCategory" : "1" , "description":"Descrizione1"},
{"idProductCategory" : "2" , "description":"Descrizione2"} ]
우리의 경우 javascript를 통해 json을 채웠는데, 제가 들은 바로는 싱글/더블 따옴표 처리에 있어서 조금 혼란스러울 수 있습니다.
이 게시물 및 기타 게시물('Accept' 및 'Content-Type' 헤더 포함)에서 이전에 언급된 내용도 적용됩니다.
도움이 되지 않길 바라.
어떻게 해야 하는지 알아냈어요.츠요시시리얼화/디시리얼화에는 다음 한 가지 방법만 사용했습니다.했습니다.@JSONSerialize ★★★★★★★★★★★★★★★★★」@JSONDeserialize를 등록했습니다.CustomObjectMapper이 행동을 설명하는 기사는 못 찾았지만 이렇게 해결했습니다.유용했으면 좋겠다.
저도 같은 문제가 있었어요.이 문제를 해결하려면 다음 절차를 따라야 합니다.
1. 다음과 같은 의존관계가 있는지 확인합니다.
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson-version}</version> // 2.4.3
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version> // 2.4.3
</dependency>
2. 다음 필터를 만듭니다.
public class CORSFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String origin = request.getHeader("origin");
origin = (origin == null || origin.equals("")) ? "null" : origin;
response.addHeader("Access-Control-Allow-Origin", origin);
response.addHeader("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, DELETE, OPTIONS");
response.addHeader("Access-Control-Allow-Credentials", "true");
response.addHeader("Access-Control-Allow-Headers",
"Authorization, origin, content-type, accept, x-requested-with");
filterChain.doFilter(request, response);
}
}
3. web.xml의 요구에 대해 위의 필터를 적용합니다.
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>com.your.package.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>corsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
나는 이것이 누군가에게 유용하기를 바란다.
스프링 부츠 + 스프링 MVN
문제가 되어
@PostMapping("/addDonation")
public String addDonation(@RequestBody DonatorDTO donatorDTO) {
해결책을 가지고
@RequestMapping(value = "/addDonation", method = RequestMethod.POST)
@ResponseBody
public GenericResponse addDonation(final DonatorDTO donatorDTO, final HttpServletRequest request){
pom에 jackson-json 데이터 바인딩을 추가하여 이 문제를 해결했습니다.
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.3</version>
</dependency>
모델 클래스에 json 속성 주석을 추가하고 기본 생성자도 있음
@JsonProperty("user_name")
private String userName;
@JsonProperty("first_name")
private String firstName;
@JsonProperty("last_name")
private String lastName;
저도 같은 문제가 있었어요.추가
<mvc:annotation-driven />
<mvc:default-servlet-handler />
봄까지 (xml로 해결)
Accept 헤더와 Content-Type 헤더를 설정하고 컨트롤러 방식의 소비/생산 설정과 일치하는지 확인하는 것 외에 JSON 구조를 살펴보고 마샬링 및 언마셜링에 문제가 없는지 확인하는 것도 좋습니다.제 경우 콘텐츠 타입은 정상이지만 JSON 요청을 요청/응답 모델에 매핑하는 데 문제가 있었습니다.통상 컨트롤러는 415 에러가 아닌 400 에러를 반환하지만, 제 경우는 에러 코드가 415였습니다.ObjectMapper를 사용하여 JSON을 읽어낸 테스트클래스를 요청 모델오브젝트에 추가하여 문제를 디버깅했습니다.ObjectMapper가 요청에 의해 정지되어 모델 클래스 정의를 수정하는 데 도움이 되는 오류가 발생했습니다.
1.a. application Context-mvc.xml에 다음 추가
xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/mvc
- 잭슨 라이브러리 추가
언급URL : https://stackoverflow.com/questions/11492325/post-json-fails-with-415-unsupported-media-type-spring-3-mvc
'source' 카테고리의 다른 글
| 커스텀 투고가 저장 또는 갱신될 때마다 트리거되는 WordPress에서 사용할 수 있는 액션은 무엇입니까? (0) | 2023.02.07 |
|---|---|
| WP_DEBUG_LOG가 true로 설정되어 있으면 debug.log에 디버깅 출력이 표시되지 않습니다.이유는 무엇입니까? (0) | 2023.02.07 |
| Wordpress 기반 외부에 있는 URL로 다시 쓰기 (0) | 2023.02.07 |
| WordPress 링크 모두 이중 URL로 리디렉션 (0) | 2023.02.07 |
| 워드프레스 카테고리.php 페이지 번호 404 오류 (0) | 2023.02.07 |