当前位置: 首页 > 知识库问答 >
问题:

spring boot:注入autowired依赖项失败;

麹高远
2023-03-14

在启动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>

这是日志(对格式抱歉):

问题已经修复,我更新了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();
}

}

`

共有1个答案

陶永望
2023-03-14

您缺少一个CloseBleHttpClient类型的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
   }
}
 类似资料: