在spring-boot中使用RestTemplate返回404错误。

7 浏览
0 Comments

在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 ResponseEntity getTheSentiments(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");
    MultiValueMap map = 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 ResponseEntity getSentimentsMc(mcSentimentRequestDTO sentimentRequestDTO) {
    ResponseEntity dto = null;
    try {
        dto = sentimentConverter.getTheSentiments(mcsParser.parseTheSentiments(sentimentRequestDTO.getText(), Languages.ENGLISH, sentimentRequestDTO.getKey()));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return dto;
}

0
0 Comments

使用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 ResponseEntity getTheSentiments(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 ResponseEntity getTheSentiments(mcSentimentRequestDTO sentimentRequestDTO){
    return sentimentParserService.getSentimentsMc(sentimentRequestDTO);
}

通过以上方法,可以解决在Spring Boot中使用RestTemplate返回404错误的问题。

0
0 Comments

使用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的问题。

0