春季启动中的“不受支持的媒体类型”-Windows

时间:2019-07-28 06:06:07

标签: java spring spring-boot curl

我有一个User这样的课程:

@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")));
    };
}

给我这个:

spring boot pre-loading

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

spring-boot curl get

这是很正确的,尽管它给了我email而不是eMail

但是当我给

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

它说:

spring-boot curl post

这太恐怖了。我正在关注this教程。

这是我的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);
            });
}

现在出现两个问题

  • 为什么要用email代替eMail而不是eMail
  • 如何正确email,我在做什么错了?

2 个答案:

答案 0 :(得分:3)

为什么用email代替eMail ”-这只是Jackson的默认行为。

要获取eMail而不是email 的方法”-您可以在POJO上控制Jackson的行为方式注释。这里是@JsonProperty。有关详细信息,请参见this questio

如何正确POST,我在做什么错了?”-您是说PUT而不是POST,不是吗?定义该方法消耗的内容类型:

@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\" }"

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

答案 1 :(得分:-1)

consumes批注上添加缺少的@PutMapping属性,

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

尽管它给了我电子邮件而不是电子邮件

这全部取决于您getter/setter实体中属性eMail的{​​{1}}。我认为您的getter必须为User,因此按照惯例,您会以JSON属性的形式收到回复电子邮件。