Java 找不到RestOperations bean
我正在尝试为我的spring boot项目设置基本身份验证。到目前为止,我已经做到了: com.app.apitool.RESTConsumer包中的CallAPI.javaJava 找不到RestOperations bean,java,rest,api,spring-boot,Java,Rest,Api,Spring Boot,我正在尝试为我的spring boot项目设置基本身份验证。到目前为止,我已经做到了: com.app.apitool.RESTConsumer包中的CallAPI.java public class CallAPI { RestTemplate restTemplate = new RestTemplate(); @Autowired RestTemplateBuilder restTemplateBuilderObj; @Autowired BasicAuthSetup basicAu
public class CallAPI {
RestTemplate restTemplate = new RestTemplate();
@Autowired
RestTemplateBuilder restTemplateBuilderObj;
@Autowired
BasicAuthSetup basicAuthObj;
@Autowired
RestOperations rest;
String endpointURL = "";
public String pingAPi() {
HttpEntity<String> request = new HttpEntity<String>(basicAuthObj.getHeaders());
ResponseEntity<String> response = rest.exchange(endpointURL, HttpMethod.GET, request, String.class);
System.out.println(response.getBody());
return response.getBody();
}
}
@Component
public class BasicAuthSetup {
private String plainCreds = "id@account1:password";
private String base64Creds = Base64.getEncoder().encodeToString(plainCreds.getBytes());
@Bean
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic" + base64Creds);
System.out.println("Auth created: "+headers);
return headers;
}
}
运行时,我得到以下异常:
应用程序无法启动
说明: com.appd.apitool.restcummer.CallAPI中的字段rest需要一个 键入“org.springframework.web.client.restcomperations”,该操作无法 找到了 行动: 考虑定义类型为的bean 配置中的“org.springframework.web.client.RestOperations” 我在谷歌上搜索了这个错误,发现了一个类似的问题(如果不是相同的话),我正在遵循上面提到的解决方案 我之所以决定创建一个新问题,是因为我没有看到在第一个链接所在的帖子中提到的任何解决方案。另外,我还不熟悉spring引导框架 com.App.apitool包中的MainApp.java:
@SpringBootApplication
@RestController
public class App {
private static final Logger log = org.slf4j.LoggerFactory.getLogger(App.class);
@Autowired
private CallAPI callAPIobj;
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@RequestMapping("/api")
public String testAPI() {
return callAPIobj.pingAPi();
}
}
好的,在您的Maven项目中,您的基本身份验证设置将是您的bean配置的好地方: BasicAuthSetup.java:
package com.app.apitool.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.util.Base64;
@Configuration
public class BasicAuthSetup {
private static final String plainCreds = "id@account1:password";
private static final String base64Creds = Base64.getEncoder().encodeToString(plainCreds.getBytes());
@Bean
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic" + base64Creds);
return headers;
}
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(new ObjectMapper());
restTemplate.getMessageConverters().add(converter);
return restTemplate;
}
@Bean
public HttpEntity<String> stringHttpEntity() {
return new HttpEntity<>(getHeaders());
}
}
package com.app.apitool.config;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.http.HttpEntity;
导入org.springframework.http.HttpHeaders;
导入org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
导入org.springframework.web.client.rest模板;
导入java.util.Base64;
@配置
公共类基本设置{
私有静态最终字符串plainCreds=”id@account1:密码”;
私有静态最终字符串base64Creds=Base64.getEncoder().encodeToString(plainCreds.getBytes());
@豆子
公共HttpHeaders getHeaders(){
HttpHeaders=新的HttpHeaders();
标题。添加(“授权”、“基本”+base64Creds);
返回标题;
}
@豆子
公共RestTemplate RestTemplate(){
RestTemplate RestTemplate=新RestTemplate();
MappingJackson2HttpMessageConverter=新的MappingJackson2HttpMessageConverter();
setObjectMapper(新的ObjectMapper());
restemplate.getMessageConverters().add(converter);
返回REST模板;
}
@豆子
公共HttpEntity stringHttpEntity(){
返回新的HttpEntity(getHeaders());
}
}
然后,在适当的包中的/src/main/java下创建一个测试类,如下所示:
CallAPITest.java:
package com.app.apitool;
import com.app.apitool.config.BasicAuthSetup;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.web.client.RestOperations;
import static org.junit.Assert.assertNotNull;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = BasicAuthSetup.class)
public class CallAPITest {
private static final String endpointURL = "";
@Autowired
private RestOperations rest;
@Autowired
private HttpEntity<String> stringHttpEntity;
@Test
public void pingAPi() {
ResponseEntity<String> response = rest.exchange(endpointURL, HttpMethod.GET, stringHttpEntity, String.class);
System.out.println(response.getBody());
final String responseBody = response.getBody();
assertNotNull(responseBody);
}
}
package com.app.apitool;
导入com.app.apitool.config.BasicAuthSetup;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.http.HttpEntity;
导入org.springframework.http.HttpMethod;
导入org.springframework.http.ResponseEntity;
导入org.springframework.test.context.ContextConfiguration;
导入org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
导入org.springframework.web.client.rest操作;
导入静态org.junit.Assert.assertNotNull;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=BasicAuthSetup.class)
公共类调用测试{
私有静态最终字符串endpointURL=“”;
@自动连线
私人休息;
@自动连线
私有HttpEntity stringHttpEntity;
@试验
公共API(){
ResponseEntity response=rest.exchange(endpointURL、HttpMethod.GET、stringHttpEntity、String.class);
System.out.println(response.getBody());
最终字符串responseBody=response.getBody();
assertNotNull(responseBody);
}
}
以下是您在Maven pom.xml中对上述内容所需的依赖项(根据需要更改版本):
2.9.6
4.3.5.1发布
com.fasterxml.jackson.core
杰克逊核心
${jackson.version}
com.fasterxml.jackson.core
杰克逊数据绑定
${jackson.version}
org.springframework
spring上下文
${spring.version}
org.springframework
spring上下文支持
${spring.version}
org.springframework
弹簧试验
${spring.version}
org.springframework
弹簧网
${spring.version}
朱尼特
朱尼特
4.12
测试
这里缺少很多上下文。你是如何把这些联系起来的?Java配置?XML配置?你能给我看看吗?另外,显示整个类,包括包定义等@EricGreen我没有任何配置文件,因为这是一个非常简单的基本结构。我以前从未使用过spring框架。我在上面添加了我的主类。RestOperations
是一个由实现的接口,您已经自动连接了一个RestTemplateBuilder
,用于创建RestTemplate
对象,那么为什么您认为可以自动连接RestOperations
?使用生成器。这就是它的目的同样,还有一个带有本地创建实例的restemplate
字段,那么为什么需要RestOperations
?@user2607744为什么要连接restemplatebuilder
?为什么您认为需要连接到RestOperations
?为什么要直接创建一个RestTemplate
?这三个动作似乎都是为了同一个目的。你一直在学习什么奇怪的教程?重新检查您的源材料,看看应该如何做。或者只需阅读文档,即Spring Boot参考指南,部分,其中显示您连接了一个RestTemplateBuilder
,使用它来构建一个RestTemplate
,然后使用它来执行REST调用。
<properties>
<jackson.version>2.9.6</jackson.version>
<spring.version>4.3.5.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>