繁体   English   中英

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

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

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

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

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

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”后,我在 controller 方法末尾收到 HTTP 406 响应。

提前致谢。

看起来您错误地使用了 ResponseEntity.BodyBuilder。 这是一个例子

因此,您的 controller 代码应如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM