【发布时间】:2019-07-03 06:32:00
【问题描述】:
在 Spring api 中,我在 RestController 中有一个用于 POST 请求的方法,但是,当 Postman 发出请求时,系统返回错误 415:
{
"timestamp": "2019-07-02T18:08:48.859+0000",
"status": 415,
"error": "Unsupported Media Type",
"message": "Content type 'application/json;charset=UTF-8' not supported",
"path": "/api/call"
}
RestController 类:
@RestController("/api/call")
public class CallController {
private final MailService mailService;
public CallController(MailService mailService) {
super();
this.mailService = mailService;
}
@PostMapping
public ResponseEntity<Void> postCall(@Valid @RequestBody Email formEmail) throws URISyntaxException {
mailService.sendMail();
return ResponseEntity.noContent().build();
}
}
电子邮件类别:
public class Email {
private static String MAIL_TO = "mail@email.com";
@Null
private String mailTo;
@NotNull
@Size(min = 3)
private String nameUserRequest;
@NotNull
@javax.validation.constraints.Email
private String emailUserRequest;
@NotNull
private String text;
public Email() {
super();
}
public String getMailTo() {
mailTo = MAIL_TO;
return mailTo;
}
public void setMailTo(String mailTo) {
this.mailTo = mailTo;
}
public String getNameUserRequest() {
return nameUserRequest;
}
public void setNameUserRequest(String nameUserRequest) {
this.nameUserRequest = nameUserRequest;
}
public String getEmailUserRequest() {
return emailUserRequest;
}
public void setEmailUserRequest(String emailUserRequest) {
this.emailUserRequest = emailUserRequest;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
@Override
public String toString() {
return "Email [nameUserRequest=" + nameUserRequest + ", emailUserRequest=" + emailUserRequest + ", text=" + text
+ "]";
}
}
邮递员请求:
目的是Post方法只接收一个Json for Email,发送邮件后返回成功,但是返回错误415,我试过@PostMapping(consumes ="application/json", produces="application/json")还是不行。系统接受 Json 请求还剩下什么?
已编辑
我的 pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.company.mail.call</groupId>
<artifactId>mail-call</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>mail-call</name>
<description>Mail call</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
【问题讨论】:
-
您是如何设置应用程序的;它是样板 Initializr 项目吗?你能包括你的POM吗? (如注:您永远不需要显式调用
super()并且可以完全删除您的Email构造函数。如果您知道您想要返回 No Content 您可以将您的方法设为void并注释@ResponseStatus(NO_CONTENT)。最后,我建议将您的类命名为EmailForm或EmailDto,因为简单的名称Email被大量使用,包括您可能想在该类中使用的Hibernate@Email注解。) -
可以试试加
@PostMapping(value= "", consumes=MediaType.APPLICATION_JSON_UTF8_VALUE, produces=MediaType.APPLICATION_JSON_UTF8_VALUE)吗?您是否更改了 Jackson 配置? -
您是否将
content-type=application;json放入邮递员的标题中? -
我添加了有问题的 pom.xml。关于Jackson,我没有配置,实际上我现在开始看到一些关于它的东西,我需要它来运行Json on the requisitions吗?
-
你是对的@chrylis!我的 Email 类导致了这个问题,因为它最终导入了电子邮件验证:( 现在它工作了。
标签: java json spring-boot