我有一个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")));
};
}
给我这个:
现在,当我给curl -v localhost:8080/user
这个命令时,它给了我这个:
这是很正确的,尽管它给了我email
而不是eMail
。
但是当我给
curl -X PUT localhost:8080/user/3 -H 'Content-type:application/json' -d '{"passwordHash":"12345","email":"admin1@admin.com"}'
它说:
这太恐怖了。我正在关注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
,我在做什么错了?答案 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属性的形式收到回复电子邮件。