Spring API REST 控制器在 POST 方法后返回 HTTP 406 而不是 HTTP 201

Spring API REST Controller returning HTTP 406 instead of HTTP 201 after POST method

我正在构建和测试一个简单的 Spring 启动 API REST 教程。 我遇到了一个我试图理解的问题。我在调用 POST 方法创建和保留新实体时收到 HTTP 406(不可接受)。

问题是实体是持久化的,但对客户端的响应不是预期的(在这种情况下,HTTP 201 CREATED with URI)。

Tutorial 和 TutorialDto classes 具有完全相同的属性。这是定义:

public class TutorialDto {
    private long id;
    private String title;
    private String description;
    private boolean published;

...
}

这是我在@RestController class 中的 POST 方法:

@PostMapping("/tutorial")
public ResponseEntity.BodyBuilder createTutorial(@RequestBody final TutorialDto tutorialDto) {
    final TutorialDto createdTutorial = tutorialService.add(tutorialDto);
    return ResponseEntity.created(URI.create(String.format("tutorial/%d", createdTutorial.getId())));
}

这里是创建实体的@Service 方法:

@Transactional
public TutorialDto add(final TutorialDto tutorialDto) {
    final Tutorial createdTutorial = tutorialRepository.save(modelmapper.map(tutorialDto, Tutorial.class));
    return Optional.of(modelmapper.map(createdTutorial, TutorialDto.class))
            .orElseThrow(() -> new TutorialCreationException(
                    String.format("Tutorial: %s could not be created", tutorialDto.getTitle()))
            );
}

这是请求正文:

{
    "title": "tutorial",
    "description": "This is the first created tutorial"
}

这是响应正文:

{
    "timestamp": "2022-04-16T00:40:36.626+00:00",
    "status": 406,
    "error": "Not Acceptable",
    "path": "/api/v1/tutorial"
}

在返回“ResponseEntity.created”后,我在控制器方法的末尾收到 HTTP 406 响应。

提前致谢。

看来您对 ResponseEntity.BodyBuilder 的用法有误。 Here is an example

因此,您的控制器代码应如下所示:

@PostMapping("/tutorial")
public ResponseEntity createTutorial(@RequestBody final TutorialDto tutorialDto) {
    final TutorialDto createdTutorial = tutorialService.add(tutorialDto);
    return ResponseEntity.created(URI.create(String.format("tutorial/%d", createdTutorial.getId()))).body(createdTutorial);
}