在启动springboot应用程序时出现了一些异常。我不知道我错过了什么。
这是我的代码: 这是入口:
package com.kindlepocket.web;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.kindlepocket.web.controller.KindlePocketController;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
这是控制器:
package com.kindlepocket.web.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.dom4j.DocumentException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.kindlepocket.web.service.TextBookInfoSearchService;
import com.kindlepocket.web.util.CheckUtil;
import com.kindlepocket.web.util.MessageUtil;
@Component
@RequestMapping("/Weixin")
public class KindlePocketController {
private static final long serialVersionUID = 1L;
@Autowired
private TextBookInfoSearchService searchService;// = new TextBookInfoSearchService();
private static Logger logger = Logger.getLogger(KindlePocketController.class);
@RequestMapping(value = "/wx.do", method = RequestMethod.GET)
@ResponseBody
public void validate(HttpServletRequest request, HttpServletResponse response,
@RequestParam("signature") String signature, @RequestParam("timestamp") String timestamp,
@RequestParam("nonce") String nonce, @RequestParam("echostr") String echostr) {
if (logger.isInfoEnabled()) {
logger.info("\n***The message got: signature:" + signature + " timestamp:" + timestamp
+ " nonce:" + nonce + " echostr:" + echostr);
}
PrintWriter out = null;
try {
out = response.getWriter();
} catch (IOException e) {
if (logger.isDebugEnabled()) {
logger.debug("response error");
}
}
if (CheckUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
if (logger.isInfoEnabled()) {
logger.info("validated!");
}
}
}
@RequestMapping(value = "/wx.do", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity processMessage(HttpServletRequest request, HttpServletResponse response)
throws IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
/*
* PrintWriter out = null; try { out = response.getWriter(); } catch (IOException e) { e.printStackTrace(); }
*/
try {
Map<String, String> map = MessageUtil.xmlToMap(request);
String fromUserName = map.get("FromUserName");
String toUserName = map.get("ToUserName");
String msgType = map.get("MsgType");
String content = map.get("Content");
if (logger.isInfoEnabled()) {
logger.info("\n***The message got: fromUserName:" + fromUserName + " toUserName:"
+ toUserName + " msgType:" + msgType + " content:" + content);
}
String responseMessage = null;
if (MessageUtil.MESSAGE_TEXT.equals(msgType)) {
switch (content) {
case "1":
responseMessage = MessageUtil.initText(toUserName, fromUserName, MessageUtil.firstMenu());
break;
case "2":
responseMessage = MessageUtil
.initText(toUserName, fromUserName, MessageUtil.secondMenu());
break;
case "3":
responseMessage = MessageUtil.initPicTextMessage(toUserName, fromUserName);
break;
default:
// responseMessage = MessageUtil.initText(toUserName, fromUserName, MessageUtil.menuText());
List<String> titleList = this.searchService.search(content);
responseMessage = MessageUtil.initPicTextMessage(toUserName, fromUserName, titleList);
break;
}
/*
* TextMessage textMessage = new TextMessage(); textMessage.setFromUserName(toUserName); textMessage.setToUserName(fromUserName); textMessage.setMsgType("text"); textMessage.setCreateTime(new Date().getTime()); textMessage.setContent("the message you sent was : " + content); responseMessage = MessageUtil.textMessageToXml(textMessage); if (logger.isInfoEnabled()) { logger.info("the message responsed is :\n" + responseMessage); }
*/
} else if (MessageUtil.MESSAGE_EVENT.equals(msgType)) {
String eventType = map.get("Event");
if (MessageUtil.MESSAGE_SUBSCRIBE.equals(eventType)) {
responseMessage = MessageUtil.initText(toUserName, fromUserName,
MessageUtil.welcomeText());
}
}
if (logger.isInfoEnabled()) {
logger.info("\n***The message responsed: \n" + responseMessage);
}
// out.print(responseMessage);
return ResponseEntity.status(HttpStatus.OK).body(responseMessage);
} catch (DocumentException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
} /*
* finally { out.close(); }
*/
}
/*
* public static void main(String[] args) { SpringApplication.run(KindlePocketController.class, args); }
*/
}
这是服务:
package com.kindlepocket.web.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class TextBookInfoSearchService {
@Autowired
private ApiService apiService;
public List<String> search(String content) {
Map<String, Object> contentMap = new HashMap<String, Object>();
contentMap.put("title", content);
try {
String result = this.apiService.doGet("http://127.0.0.1:8081/search/title", contentMap);
System.out.println("result:" + result);
} catch (Exception e) {
e.printStackTrace();
}
List<String> titles = new ArrayList<String>();
// test
titles.add("张学良口述历史");
titles.add("布谷鸟的呼唤");
return titles;
}
}
package com.kindlepocket.web.service;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.kindlepocket.web.pojo.HttpResult;
/**
* 负责和外部接口对接,发起http请求
*
*/
@Component
public class ApiService {
@Autowired
private CloseableHttpClient httpClient;
@Autowired
private RequestConfig requestConfig;
/**
* 执行DoGET请求
*
* @param url
* @return 如果响应是200,返回具体的响应内容,其他响应返回null
* @throws ClientProtocolException
* @throws IOException
*/
public String doGet(String url) throws ClientProtocolException, IOException {
// 创建http GET请求
HttpGet httpGet = new HttpGet(url);
httpGet.setConfig(this.requestConfig);
CloseableHttpResponse response = null;
try {
// 执行请求
response = httpClient.execute(httpGet);
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == 200) {
return EntityUtils.toString(response.getEntity(), "UTF-8");
}
} finally {
if (response != null) {
response.close();
}
}
return null;
}
/**
* 带有参数的GET请求
*
* @param url
* @param param
* @return
* @throws ClientProtocolException
* @throws IOException
* @throws URISyntaxException
*/
public String doGet(String url, Map<String, Object> param) throws ClientProtocolException, IOException,
URISyntaxException {
// 定义请求的参数
URIBuilder uriBuilder = new URIBuilder(url);
for (Map.Entry<String, Object> entry : param.entrySet()) {
uriBuilder.addParameter(entry.getKey(), entry.getValue().toString());
}
return doGet(uriBuilder.build().toString());
}
/**
* 指定POST请求
*
* @param url
* @param param 请求参数
* @return 状态码和请求的body
* @throws IOException
*/
public HttpResult doPost(String url, Map<String, Object> param) throws IOException {
// 创建http POST请求
HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(this.requestConfig);
if (param != null) {
// 设置post参数
List<NameValuePair> parameters = new ArrayList<NameValuePair>(0);
for (Map.Entry<String, Object> entry : param.entrySet()) {
parameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString()));
}
// 构造一个form表单式的实体,并且指定参数的编码为UTF-8
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters, "UTF-8");
// 将请求实体设置到httpPost对象中
httpPost.setEntity(formEntity);
}
CloseableHttpResponse response = null;
try {
// 执行请求
response = httpClient.execute(httpPost);
if (response.getEntity() != null) {
return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString(
response.getEntity(), "UTF-8"));
}
return new HttpResult(response.getStatusLine().getStatusCode(), null);
} finally {
if (response != null) {
response.close();
}
}
}
/**
* 执行PUT请求
*
* @param url
* @param param 请求参数
* @return 状态码和请求的body
* @throws IOException
*/
public HttpResult doPut(String url, Map<String, Object> param) throws IOException {
// 创建http POST请求
HttpPut httpPut = new HttpPut(url);
httpPut.setConfig(this.requestConfig);
if (param != null) {
// 设置post参数
List<NameValuePair> parameters = new ArrayList<NameValuePair>(0);
for (Map.Entry<String, Object> entry : param.entrySet()) {
parameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString()));
}
// 构造一个form表单式的实体,并且指定参数的编码为UTF-8
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters, "UTF-8");
// 将请求实体设置到httpPost对象中
httpPut.setEntity(formEntity);
}
CloseableHttpResponse response = null;
try {
// 执行请求
response = httpClient.execute(httpPut);
if (response.getEntity() != null) {
return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString(
response.getEntity(), "UTF-8"));
}
return new HttpResult(response.getStatusLine().getStatusCode(), null);
} finally {
if (response != null) {
response.close();
}
}
}
/**
* 指定POST请求
*
* @param url
* @param param 请求参数
* @return 状态码和请求的body
* @throws IOException
*/
public HttpResult doPostJson(String url, String json) throws IOException {
// 创建http POST请求
HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(this.requestConfig);
if (json != null) {
// 构造一个字符串的实体
StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON);
// 将请求实体设置到httpPost对象中
httpPost.setEntity(stringEntity);
}
CloseableHttpResponse response = null;
try {
// 执行请求
response = httpClient.execute(httpPost);
if (response.getEntity() != null) {
return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString(
response.getEntity(), "UTF-8"));
}
return new HttpResult(response.getStatusLine().getStatusCode(), null);
} finally {
if (response != null) {
response.close();
}
}
}
/**
* 没有参数的post请求
*
* @param url
* @return
* @throws IOException
*/
public HttpResult doPost(String url) throws IOException {
return doPost(url, null);
}
/**
* 执行PUT请求
*
* @param url
* @return 状态码和请求的body
* @throws IOException
*/
public HttpResult doPut(String url) throws IOException {
return this.doPut(url, null);
}
/**
* 执行DELETE请求,通过POST提交,_method指定真正的请求方法
*
* @param url
* @param param 请求参数
* @return 状态码和请求的body
* @throws IOException
*/
public HttpResult doDelete(String url, Map<String, Object> param) throws IOException {
param.put("_method", "DELETE");
return this.doPost(url, param);
}
/**
* 执行DELETE请求(真正的DELETE请求)
*
* @param url
* @return 状态码和请求的body
* @throws IOException
*/
public HttpResult doDelete(String url) throws IOException {
// 创建http DELETE请求
HttpDelete httpDelete = new HttpDelete(url);
httpDelete.setConfig(this.requestConfig);
CloseableHttpResponse response = null;
try {
// 执行请求
response = httpClient.execute(httpDelete);
if (response.getEntity() != null) {
return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString(
response.getEntity(), "UTF-8"));
}
return new HttpResult(response.getStatusLine().getStatusCode(), null);
} finally {
if (response != null) {
response.close();
}
}
}
}
这是pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kindlepocket.web</groupId>
<artifactId>kindlepocket-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>xpp3</groupId>
<artifactId>xpp3</artifactId>
<version>1.1.4c</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
这是日志(抱歉格式):
org.springframework.beans.factory.BeanCreationException:创建名称为&#39; kindlePocketController&#39;的注册自动连接依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.kindlepocket.web.service.TextBookInfoSearchService com.kindlepocket.web.controller.KindlePocketController.searchService;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为&text; TextBookInfoSearchService&#39;:自动连接依赖项的注入失败的错误;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.kindlepocket.web.service.ApiService com.kindlepocket.web.service.TextBookInfoSearchService.apiService;嵌套异常是org.springframework.beans.factory.BeanCreationException:使用名称&#39; apiService&#39;创建bean时出错:注册自动装配的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private org.apache.http.impl.client.CloseableHttpClient com.kindlepocket.web.service.ApiService.httpClient;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为[org.apache.http.impl.client.CloseableHttpClient]的限定bean:预期至少有1个bean可以作为此依赖项的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)} 在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)〜[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)〜[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)〜[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)〜[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306)〜[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)〜[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)〜[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)〜[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)〜[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 在org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)〜[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)〜[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)~ [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 在org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766)[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 在org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361)[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 在org.springframework.boot.SpringApplication.run(SpringApplication.java:307)[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 在org.springframework.boot.SpringApplication.run(SpringApplication.java:1191)[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 在org.springframework.boot.SpringApplication.run(SpringApplication.java:1180)[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 在com.kindlepocket.web.Application.main(Application.java:10)[classes /:na] 引起:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.kindlepocket.web.service.TextBookInfoSearchService com.kindlepocket.web.controller.KindlePocketController.searchService;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为&text; TextBookInfoSearchService&#39;:自动连接依赖项的注入失败的错误;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.kindlepocket.web.service.ApiService com.kindlepocket.web.service.TextBookInfoSearchService.apiService;嵌套异常是org.springframework.beans.factory.BeanCreationException:使用名称&#39; apiService&#39;创建bean时出错:注册自动装配的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private org.apache.http.impl.client.CloseableHttpClient com.kindlepocket.web.service.ApiService.httpClient;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为[org.apache.http.impl.client.CloseableHttpClient]的限定bean:预期至少有1个bean可以作为此依赖项的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)} 在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573)〜[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 在org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)〜[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)〜[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] ...省略了17个常见帧
问题已修复 我像这样更新了ContextConfig.class: `
package com.kindlepocket.web;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ContextConfig {
@Bean
public CloseableHttpClient httpClient() {
return HttpClientBuilder.create().build();
}
@Bean
public RequestConfig requestConfig() {
return RequestConfig.custom().build();
}
}
`
答案 0 :(得分:5)
您缺少CloseableHttpClient
类型的bean。在spring上下文配置中创建类型为CloseableHttpClient
的bean。
更新:
您可以在组件扫描包中创建Configuration
类,并创建类型为CloseableHttpClient
的bean。
package com.kindlepocket.web;
@Configuration
public class ContextConfig {
@Bean
public CloseableHttpClient closeableHttpClient() {
return new CloseableHttpClient(); // Return an instance
}
}