当前位置: 首页 > 知识库问答 >
问题:

spring boot-Windows中的“不支持的媒体类型”

戚泰
2023-03-14

我有一个这样的用户类:

@Data
@Entity
public class User {
    @Id
    @GeneratedValue
    Long userID;

    String eMail;

    String passwordHash;

    //ArrayList<ClassRoom>adminOf=new ArrayList<>();

    User() {}

    public User(String eMail, String passwordHash) {
        this.eMail = eMail;
        this.passwordHash = passwordHash;
    }
}

在LoadDatabase类中,我有:

@Bean
CommandLineRunner initDatabase(UserRepository userRepository) {
    return args -> {
        log.info("Preloading " + userRepository.save(new User("admin@admin.com", "asdasd")));
        log.info("Preloading " + userRepository.save(new User("admin@admin.com", "12345")));
    };
}

这给了我这个:

现在,当我给curl-vlocalhost:8080/user这个命令时,它给我这个:

这很正确,虽然它给我的是电子邮件,而不是电子邮件。

但当我给予

curl -X PUT localhost:8080/user/3 -H 'Content-type:application/json' -d '{"passwordHash":"12345","email":"admin1@admin.com"}'

上面写着:

这太可怕了。我正在学习本教程

这是我的UserController课程:

package com.mua.cse616.Controller;


import com.mua.cse616.Model.User;
import com.mua.cse616.Model.UserNotFoundException;
import org.springframework.web.bind.annotation .*;

import java.util.List;

@RestController
class UserController {

    private final UserRepository repository;

    UserController(UserRepository repository) {
        this.repository = repository;
    }

    // Aggregate root

    @GetMapping("/user")
    List<User> all() {
        return repository.findAll();
    }

    @PostMapping("/user")
    User newUser(@RequestBody User newUser) {
        return repository.save(newUser);
    }

    // Single item

    @GetMapping("/user/{id}")
    User one(@PathVariable Long id) {

        return repository.findById(id)
                .orElseThrow(() -> new UserNotFoundException(id));
    }

    @PutMapping("/user/{id}")
    User replaceUser(@RequestBody User newUser, @PathVariable Long id) {

        return repository.findById(id)
                .map(employee -> {
                    employee.setEMail(newUser.getEMail());
                    employee.setPasswordHash(newUser.getPasswordHash());
                    return repository.save(employee);
                })
                .orElseGet(() -> {
                    newUser.setUserID(id);
                    return repository.save(newUser);
                });
    }

    @DeleteMapping("/user/{id}")
    void deleteUser(@PathVariable Long id) {
        repository.deleteById(id);
    }
}

更新后放置方法:

@PutMapping(path="/user/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
User replaceUser(@RequestBody User newUser, @PathVariable Long id) {

    return repository.findById(id)
            .map(employee -> {
                employee.setEMail(newUser.getEMail());
                employee.setPasswordHash(newUser.getPasswordHash());
                return repository.save(employee);
            })
            .orElseGet(() -> {
                newUser.setUserID(id);
                return repository.save(newUser);
            });
}

现在出现了两个问题。

  • 为什么要用电子邮件代替电子邮件,如何用电子邮件代替电子邮件

共有2个答案

太叔马鲁
2023-03-14

在PutMapping注释上添加缺少的消耗属性,

@PutMapping(path= "/user/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
User replaceUser(@RequestBody User newUser, @PathVariable Long id) {

虽然它给我电子邮件而不是电子邮件

这完全取决于您的用户实体中属性的获取者/设置者。我认为您的getter必须是getEmail(),因此通常您会将响应电子邮件作为JSON属性获取。

东郭臻
2023-03-14

“为什么不发电子邮件而发电子邮件呢?”——这只是杰克逊的默认行为。

“如何获取电子邮件而不是电子邮件”—您可以通过POJO上的注释来控制Jackson的行为。此处的相关内容是JsonProperty。有关详细信息,请参见此问题。

“如何正确发布,我做错了什么?”-你的意思是“放”而不是“贴”,对吗?定义方法使用的内容类型:

@PutMapping(path="/user/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
User replaceUser(@RequestBody User newUser, @PathVariable Long id) {
    ...
}

此外,正如@rimonmostafiz所指出的,您需要重新定义curl调用,转义报价:

curl -X PUT -H "Content-Type: application/json" -d "{ \"email\": \"asd\", \"passwordHash\": \"sad\" }"

顺便说一句:以后每个帖子请限制自己一个问题。

 类似资料:
  • 问题内容: 自数小时以来,我一直在尝试纠正http错误,但它仍显示不支持的页面。我在邮递员中添加标题。 这是我的Java代码 这是我的档案 问题答案: 通过和如何在响应流和请求流之间对对象进行序列化和反序列化。 将会发生的是,将从提供者的注册表中进行搜索,以查找可以处理的媒体类型。如果找不到,则Jersey无法处理该请求,并将发送415不支持的媒体类型。通常,你还应该在服务器端记录一个异常。不知道

  • 我已经创建了一个示例web服务来进行post调用。 我使用的是Jersey JAX-RS和Maven。

  • 我正在用Spring Boot构建一些API,但是当我试图用Postman查询时,我得到了一些关于Content-Type的错误。 我不明白哪里出了问题。 我注意到错误消失时,我删除了@刚体作为参数的方法。为什么啊? 我只想: 将XML发送到API

  • 问题内容: 我正在尝试使用jQuery 1.6(Jackson 2.1.1 和Spring 3.2.0 )通过JSON通过该方法向数据库中插入和/或更新数据。 JS代码如下。 通过URL映射的Spring控制器内部的方法如下。 服务器按照问题的含义进行响应, 415不支持的媒体类型 标头信息如下所示。 整个文件如下。 当我删除一个方法参数并仅用于接受请求参数时,它可以工作。 问题答案: 浏览器发送

  • 问题内容: 我正在使用Spring 3.2,并尝试使用ajax发布请求来提交json对象数组。如果相关,我转义了所有特殊字符。 我的HTTP状态为415。 我的控制器是: jQuery是: 我发布的数组中的对象之一的示例是以下json: 错误是: 为什么会发生此错误-有人知道吗? 问题答案: 您可以尝试使用。它没有任何问题