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

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

郭兴平
2023-03-14

我正在构建和测试一个简单的Spring Boot API REST教程。我面临着一个我正在努力理解的问题。当调用POST方法来创建并持久化一个新实体时,我得到了一个HTTP 406(不可接受)。

问题是实体被持久化了,但对客户端的响应不是预期的(在本例中,HTTP 201是用URI创建的)。

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

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

...
}

以下是我在@RestController类中的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响应。

提前谢谢。

共有1个答案

马清野
2023-03-14

看来你用错了ResponseEntity。健美运动员。下面是一个例子

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

@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);
}
 类似资料:
  • 我试图创建一个Spring Rest控制器,基于这个例子我创建了一个这样的控制器。 DeveloperRestController.java web.xml dispatcher-servlet.xml 但是它显示404页没有找到,似乎是spring试图加载一个模板... 结果: 错误404/we b-INF/JSP/developer/list . JSP 我该怎么办?

  • 我正在使用blueprint开发一个camel restlet项目,以部署在Fuse上。它是一个非常简单的HTTP帖子,带有简单的文本正文。我将交换模式设置为。 另外,如果处理是一个长时间运行的进程,会发生什么?我希望在数据发布后立即终止,而不是等到上下文中完成处理。 我的蓝图是这样的:

  • 我有一个Restful Web Application,我想测试以下类: 我的测试课程是: } 然而,当我运行测试时,我得到了:java。lang.AssertionError:预期状态: 这是我的pom。xml: 我在这个网站上回顾了几乎所有与此问题相关的问题,并尝试了任何对象Mapper和对象Wrapper的组合但仍然无法通过测试。如果有人能帮助我,我将非常感激。 以下是完整的错误:

  • 我有一个项目,其中我创建了一个BankAccount超级类和一个SavingsAccount子类。一切都很好,但我在返回我特别想要的字符串时遇到了麻烦。 示例:(裁剪) 驱动程序类将对BankAccount使用toString方法,并打印以下内容: (这对于这个超类来说是完美的) 但是,下面是SavingsAccount子类 调用SavingsAccount的toString方法时,它会打印: S

  • 问题内容: 我昨天在JavaFX中构建了一个小应用程序。我想在Controller类中获取应用程序的场景。每次尝试在控制器类中获取场景时,都会出错。我可以在Controller类的Button上设置OnKeyPressed方法,效果很好。但是,只有在选择Button后,它才能正常工作。我只能在Main类方法replaceSceneContent中获得场景。我已经读过这个问题,但是我在initial

  • 我昨天在JavaFX中构建了一个小应用程序。我想在Controller类中获取应用程序的场景。每次我试图在控制器类中获取场景时,我都会出错。我可以在Controller类中的Button上设置OnKeyPested-method,工作正常。但是只有当按钮被选中时,它才工作正常...我可以只在Main类方法replace eSceneContent中获取场景。我已经读过这个问题了,但是我在初始化方法