Spring引导不支持的媒体类型与@RequestBody

时间:2017-05-28 17:31:32

标签: java spring

我检查了几种不同的方式,还下载了一个新项目,看看有什么检查bug但我仍然不知道答案。

这是我的RestController

@RestController
@RequestMapping(value = "/message")
public class MessageController {

    @RequestMapping(value = "/", method = RequestMethod.POST)
    public void createMessage(@RequestBody Message message){
        System.out.println(message);
    }
}

那是我的模特

@Data
@Entity
public class Message {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String sender;
    private String telephone;
    private String message;
}

必要时Gradle依赖

dependencies {
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.0.pr3'
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-web')
    runtime('com.h2database:h2')
    runtime('org.postgresql:postgresql')
    compileOnly('org.projectlombok:lombok')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

并且在邮递员中我得到了那个错误

  

{" timestamp":1495992553884," status":415," error":   "不支持的媒体类型","例外":   " org.springframework.web.HttpMediaTypeNotSupportedException&#34 ;,
  " message":"内容类型   '应用程序/ X WWW的窗体-urlencoded;字符集= UTF-8'不支持",
  "路径":" / message /" }

这是最简单的休息方式,但我犯了错误?

7 个答案:

答案 0 :(得分:9)

在Postman中,在Body下,选择raw并从显示的下拉菜单中选择JSON,然后编写作为请求正文的JSON,您不能使用form-data或{ {1}}使用@RequestBody,当绑定为@ModelAttribute时使用它们。

答案 1 :(得分:3)

我使用$.post Jquery遇到了类似的问题。通过添加正确的contentTypedataType,它对我有用。

$.ajax({
    type: "POST",
    url: "/api/design/save",
    data: JSON.stringify({
        id: floorId,
        shapes: shapes,
    }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){
        console.log(data);
   },
    error: function(err) {
        console.log(err);
    }
});

答案 2 :(得分:2)

问题在于,当我们使用application/x-www-form-urlencoded时,Spring并不将其理解为RequestBody。因此,如果我们想要使用它,我们必须删除@RequestBody注释。

@RequestMapping(value = "/", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public void createMessage(Message message){
        //TODO DO your stuff here
    }

答案 3 :(得分:2)

您可以将代码编写为
headers.put("Content-Type", Arrays.asList("application/json"));
代替
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

答案 4 :(得分:2)

您需要一个@NoArgsConstructor才能进行反序列化。如果没有参数构造函数,则Http消息转换器无法将json(其他媒体类型)映射到Java对象。然后返回415

答案 5 :(得分:0)

在application.properties中添加以下行:

logging.file = myapp.log

重启服务器,提出请求。检查myapp.log以查找失败的内容。对我来说,我收到了这个错误:

2018-05-08 07:08:34.404 WARN 348 --- [http-nio-8080-exec-5] .cjMappingJackson2HttpMessageConverter:无法评估类型为[[simple type,class com.atta]的Jackson反序列化。 entity.User]]:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法处理托管/后向引用' defaultReference':后台引用类型(java.util.List)与托管类型不兼容(com .atta.entity.State)

我使用POSTMAN => raw / JSON(application / json)

答案 6 :(得分:-1)

我和杰森有同样的情况。最后只有这个有效 这是关于代码的反应

export function setServices(jsonString) {
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json;charset=UTF-8;");

var raw = jsonString;

var requestOptions = {
    method: 'POST',
    headers: myHeaders,
    body: raw,
    redirect: 'follow'
};

fetch("http://localhost:8080/setservices", requestOptions)
    .then(response => response.text())
    .then(result => console.log(result))
    .catch(error => console.log('error', error));}

控制器上的代码

@RequestMapping(value = "/setservices", method = RequestMethod.POST,
        consumes = MediaType.APPLICATION_JSON_VALUE,
        produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody  String createMessage() throws Exception {
    //do smthg

    return "Ok";    }