在spring-boot中使用RestTemplate返回404错误。
在spring-boot中使用RestTemplate返回404错误。
我正在尝试在Spring Boot应用程序中使用RestTemplate发送一个带有请求体的POST请求。这是控制器代码(我删除了`@RequestBody`,因为我使用了`application/x-www-form-urlencoded`头部):
@RestController @CrossOrigin @RequestMapping("/api") public class SentimentParserController { @Autowired private SentimentParserService sentimentParserService; @RequestMapping(value = "/something", method = RequestMethod.POST, consumes="application/x-www-form-urlencoded") public ResponseEntitygetTheSentiments(mcSentimentRequestDTO sentimentRequestDTO) { return sentimentParserService.getSentimentsMc(sentimentRequestDTO); } }
我想要将`sentimentRequestDTO`对象(包含lang、key和text)作为POST请求的请求体发送,以获取`mcResponse`对象:
public mcResponse parseTheSentiments(String text, Languages lang, String key) throws Exception { RestTemplate restTemplate = new RestTemplate(); String request = "http://localhost:8080"; mcSentimentRequestDTO mSentiments = new mcSentimentRequestDTO(key, "EN", text); HttpHeaders headers = new HttpHeaders(); headers.add("content-type", "application/x-www-form-urlencoded"); MultiValueMapmap = new LinkedMultiValueMap (); map.add("key", key); map.add("txt", text); map.add("lang", Languages.ENGLISH.toString()); HttpEntity > request1 = new HttpEntity >(map, headers); mcResponse response = restTemplate.postForObject(request, request1, mcResponse.class); return response; }
然而,我遇到了以下错误:404 null。请问你能帮助我吗?提前谢谢。以下是服务类的代码:
public ResponseEntitygetSentimentsMc(mcSentimentRequestDTO sentimentRequestDTO) { ResponseEntity dto = null; try { dto = sentimentConverter.getTheSentiments(mcsParser.parseTheSentiments(sentimentRequestDTO.getText(), Languages.ENGLISH, sentimentRequestDTO.getKey())); } catch (Exception e) { e.printStackTrace(); } return dto; }
使用RestTemplate在Spring Boot中返回404的问题可能出现的原因是请求的URL不正确或不匹配。解决方法是确保请求的URL正确,并根据控制器类的前缀进行相应的设置。
首先,确保请求的URL正确。如果控制器类有前缀,那么请求的URL应该包含该前缀。例如,如果控制器类的前缀是"/myApi",那么请求的URL应该是"http://localhost:8080/myApi/something"。
如果请求的URL正确,但仍然返回400错误,则需要在RequestMapping注解中添加consumes参数,并设置为"application/x-www-form-urlencoded"。例如,添加consumes参数的示例代码如下:
@RequestMapping(value = "/something", method = RequestMethod.POST, consumes="application/x-www-form-urlencoded") public ResponseEntitygetTheSentiments(mcSentimentRequestDTO sentimentRequestDTO){ return sentimentParserService.getSentimentsMc(sentimentRequestDTO); }
如果控制器类没有前缀,则需要在RequestMapping注解中添加consumes参数,并设置为"application/x-www-form-urlencoded"。例如,添加consumes参数的示例代码如下:
@RequestMapping(value = "/something", method = RequestMethod.POST, consumes="application/x-www-form-urlencoded") public ResponseEntitygetTheSentiments(mcSentimentRequestDTO sentimentRequestDTO){ return sentimentParserService.getSentimentsMc(sentimentRequestDTO); }
通过以上方法,可以解决在Spring Boot中使用RestTemplate返回404错误的问题。
使用RestTemplate在spring-boot中返回404的原因可能是控制器没有被包含在spring上下文中。如果您的应用程序只是用@SpringBootApplication
注释标记,那么请确保您的控制器在与您注释的应用程序相同或更低的包中。
要检查控制器是否被捡起,您可以将以下日志选项添加到您的application.properties中:
logging.level.org.springframework.beans=debug logging.level.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping=trace
当您的服务器启动时,您应该在日志中看到类似以下的内容:
1.
显示控制器在spring上下文中
DefaultListableBeanFactory : Creating shared instance of singleton bean 'sentimentParserController'
2.
显示/api/something url的映射
RequestMappingHandlerMapping : Mapped 1 handler method(s) for class SentimentParserController: {public org.springframework.http.ResponseEntity SentimentParserController.getTheSentiments(mcSentimentRequestDTO)={[/api/something],methods=[POST]}}
如果您同时看到这两个内容,那么您所说的操作应该有效。只需确保将请求发送到/api/something
,并且服务器在端口8080上运行。
如果您看到的日志与上述内容不同,那么问题可能出在其他地方。您可以检查以下几点是否有问题:
1. 确保您的控制器类位于正确的包下,并且与应用程序的注释标记相同或更低。
2. 检查您的RequestMapping注解是否正确设置,并且与您发送请求时的URL匹配。
3. 检查您的应用程序是否正确启动,并且没有其他错误或异常。
通过排除以上问题,您应该能够解决使用RestTemplate在spring-boot中返回404的问题。