org.springframework.web.HttpMediaTypeNotAcceptableException:在java spring Boot 中找不到可接受的表示

hgtggwj0  于 2023-10-16  发布在  Spring
关注(0)|答案(3)|浏览(123)

我正在使用Java Springboot和Angular 7开发聊天应用程序。我在spring Boot 和angular中使用事件。我尝试在spring Boot 中生成事件,以便angular侦听事件。然而,我得到以下错误:

Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]

下面是我在springboot中的控制器代码:

@CrossOrigin("*")
@RestController
@RequestMapping("/chat")
public class MessageController {

@Autowired
MessageService messageService;

@Autowired
private ApplicationEventPublisher applicationEventPublisher;

private static final Logger logger = LoggerFactory.getLogger(MessageController.class);

@PostMapping(consumes = "application/json", produces = "application/json")
public GenericApiResponse<Map<String, Object>>message(@RequestBody MessageRequest req) {
    logger.info("MessageController:: messagemethod [POST] /chat");
    GenericApiResponse<Map<String, Object>> responseObj = new GenericApiResponse<>();
    Object returnValue = new Object();
    try {
        returnValue = messageService.translateText(req);
    } catch (Exception e) {
        e.printStackTrace();
        logger.error("EXCEPTION: "+e.getStackTrace().toString());
        responseObj.setStatus(Constants.ERROR);
        responseObj.setMessage("Internal Server Error");
    }
    Map<String, Object> resMap = new HashMap<>();
    resMap.put("result", returnValue);
    resMap.put("sender", req.getSender());
    responseObj.setResponseObject(resMap);
    responseObj.setStatus(Constants.SUCCESS);

    MessageEvent messageEvent = new MessageEvent(this,"eventName", responseObj);
    applicationEventPublisher.publishEvent(messageEvent);

    return responseObj;
}

我不知道问题是什么,以及如何解决它。请帮我解决这个问题。提前感谢:)

omjgkv6w

omjgkv6w1#

从第一次看你的代码,我可以观察到以下问题:

  1. @ResponseBody被添加,但没有返回响应,即方法类型为void。
  2. produces = "application/json"对于没有返回响应的void方法没有意义。
    因此,对于rest端点,总是返回一些响应。你可以通过在你的方法的最后加上下面的return语句来解决这个问题:
return ResponseEntity.ok("your message");

此外,@ResponseBody意味着响应总是序列化为json,因此不需要显式指定, produces = "application/json"

更新:

您是否可以尝试将consumes = "application/json", produces = "application/json"替换为

consumes = MediaType.APPLICATION_JSON_VALUE, 
  produces = MediaType.APPLICATION_JSON_VALUE


确保请求头设置为application/json
此外,ensrueJackson的依赖性到位。

mxg2im7a

mxg2im7a2#

解决方案:angular中的EventSource默认采用Content-Type : text/event-stream。所以我创建了一个新的方法,并添加了@RequestHeader(value = "Content-Type", defaultValue = "text/event-stream")作为参数。

kgsdhlau

kgsdhlau3#

如果没有返回类型对象的getter方法,则忽略对象的自动转换。如果你没有GenericApiResponse对象的getter方法,添加一个。

相关问题