spring中set注入的一些小细节错误

这是小白偶尔一直null指针的错误,调试了好久,原来是自己对spring注入的不够了解

我相信有很多跟我差不多的初学者会遇上,所以特地写出来,防止有人跟我一样。哈哈,也写上去,以防自己下次还犯这样的错误。

一样,首先,举个反例

所有类

有个城市类

有个华北地区类,有个城市类的集合属性

同上,华南地区类

index.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
   <center>
   <h1>欢迎光临</h1><p><p><p><p>
    <form action="query" method="post">
      <table border="0">
        <tr>
            <td>
                <input type="radio" name="country" value="SC" checked> 华南旅游城市<br>
                <input type="radio" name="country" value="NC"> 华北旅游城市 <br>
            </td>
        </tr>
        <tr>
          <td colspan="2" align="center">
          <input type = "submit" name = "submit" value = "查       询" />
          </td>
        </tr>
      </table>
    </form>
   </center>
  </body>
</html>

最后有个servlet类

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;

import com.javaBean.City;
import com.javaBean.NorthChina;
import com.javaBean.SouthChina;

public class CountryServlet extends HttpServlet {

    private NorthChina northChina;
    private SouthChina southChina;

    public NorthChina getNorthChina() {
        return northChina;
    }

    public void setNorthChina(NorthChina northChina) {
        System.out.println("已经注入了,城市个数:"+northChina.getCitys().size());
        this.northChina = northChina;
    }

    public SouthChina getSouthChina() {
        return southChina;
    }

    public void setSouthChina(SouthChina southChina) {
        this.southChina = southChina;
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        String diqu=request.getParameter("country");
        PrintWriter writer = response.getWriter();
        List<City> citys=null;
        if(diqu!=null){
            if("SC".equals(diqu)){
                citys=southChina.getCitys();
            }else if("NC".equals(diqu)){
                citys=northChina.getCitys();
            }
        }
        String str="";
        for (int i = 0; i < citys.size(); i++) {
            str+=citys.get(i).getCity()+",";
        }
        writer.write(str);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<bean id="shenzhen" class="com.javaBean.City">
    <property name="city" value="深圳"></property>
</bean>
<bean id="hongkong" class="com.javaBean.City">
    <property name="city" value="香港"></property>
</bean>
<bean id="guilin" class="com.javaBean.City">
    <property name="city" value="桂林"></property>
</bean>
<bean id="guangzhou" class="com.javaBean.City">
    <property name="city" value="广州"></property>
</bean>
<bean id="beijin" class="com.javaBean.City">
    <property name="city" value="北京"></property>
</bean>
<bean id="tianjin" class="com.javaBean.City">
    <property name="city" value="天津"></property>
</bean>
<bean id="shanghai" class="com.javaBean.City">
    <property name="city" value="上海"></property>
</bean>
<bean id="haerbin" class="com.javaBean.City">
    <property name="city" value="哈尔滨"></property>
</bean>

<bean id="southChina" class="com.javaBean.SouthChina">
    <property name="citys">
         <list>
             <ref bean="guilin"/>
             <ref bean="shenzhen"/>
             <ref bean="hongkong"/>
             <ref bean="guangzhou"/>
         </list>
    </property>
</bean>
<bean id="northChina" class="com.javaBean.NorthChina">
    <property name="citys">
        <list>
            <ref bean="shanghai"/>
            <ref bean="haerbin"/>
            <ref bean="beijin"/>
            <ref bean="tianjin"/>
        </list>
    </property>
</bean>
<bean id="countryServlet" class="com.servlet.CountryServlet">
    <property name="northChina" ref="northChina"></property>
    <property name="southChina" ref="southChina"></property>
</bean>

</beans>

web.xml配置是正确的,开始部署到tomcat

打开页面访问

点击查询,然而错误就来了

测试方法中执行时会发现

原因竟然是我误认为启动服务器时,已经把NorthChina注入进去了,所以就在servlet调用类中的方法,报出null,

结果我百度搜索“set注入”(其实都是很多demo,并没有仔细详解),然后我就发现注入NorthChina的是spring容器中的CountryServlet,

并不是没被构建的CountryServlet类中。所以就只能在这两个类中加个static,就可以获取了

这样,问题就解决了(相信大神应该还有跟多好的方法,方便的话可以在评论中教导小白)。小白只是把自己在学习中遇到的问题写出来,方便自己查看学习,也可以让大家防止遇到一样的错误,嘿嘿。

版权声明:本文为不会代码的小白原创文章,未经允许不得转载。

时间: 2024-08-06 20:51:44

spring中set注入的一些小细节错误的相关文章

spring中依赖注入方式总结

Spring中依赖注入的四种方式 在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的setter方法注入 首先要配置被注入的bean,在该bean对应的类中,应该有要注入的对象属性或者基本数据类型的属性.例如:为UserBiz类注入UserDAO,同时为UserBiz注入基本数据类型String,那么这时,就要为UserDAO对象和String类型设置se

spring中构造函数注入

spring中构造函数注入,简单来说,就是通过beans.xml中,设置对应的值.而且通过bean类中的构造函数进行注入这些值. 文件结构 Goods类 package com.test.innerbean; public class Goods { private String goodsName; private int price; public Goods(String name,int price) { goodsName=name; this.price=price; } publi

Spring AOP报错处理 Can not set field to $Proxy 在spring中使用事物或AOP遇到的错误

[转] 解决方法: http://forum.springsource.org/showthread.php?85016-IllegalArgumentException-with-ApplicationContextAware-Proxy 在配置文件中加入proxy-target-class="true" <tx:annotation-driven transaction-manager="transactionManager" proxy-target-c

spring中依赖注入

<!--spring中的依赖注入 依赖注入: Dependency Injection IOC的作用: 降低程序间的耦合(依赖关系) 依赖关系的管理: 以后都交给spring来维护 在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明 依赖关系的维护: 就称之为依赖注入 依赖注入: 能注入的数据:有三种 基本类型和String 其他bean类型(在配置文件中或者注解配置过的bean) 复杂类型/集合类型 注入的方式:有三种 第一种:使用构造函数提供 第二种:使用se

mybatis 操作存储过程 小细节错误

项目开发的时候遇到一个错误: <span style="font-size:24px;">org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLException: ORA-06550: 第 8 行, 第 4 列: PLS-00103: 出现符号 ";"在需要下列之一时: . ( ) , * @ % & =

Spring中依赖注入的使用和配置

使用方法1: //在执行此实例化的时候就会完成所有注入 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); UserService service = (UserService)ctx.getBean("userService"); 使用方法2: public class SocketRequest { /** * 默认实例 */ private

Spring点滴七:Spring中依赖注入(Dependency Injection:DI)

Spring机制中主要有两种依赖注入:Constructor-based Dependency Injection(基于构造方法依赖注入) 和 Setter-based Dependency Injection(基于Setter方法依赖注入) 一.Contructor-based Dependency Injection(基于构造方法注入) 在bean标签中通过使用<constructor-arg />标签来实现 spring.xml <?xml version="1.0&qu

Java Spring 中你不知道的注入方式

前言 在Spring配置文件中使用XML文件进行配置,实际上是让Spring执行了相应的代码,例如: 使用<bean>元素,实际上是让Spring执行无参或有参构造器 使用<property>元素,实际上是让Spring执行一次setter方法 但Java程序还可能有其他类型的语句:调用getter方法.调用普通方法.访问类或对象的Field等,而Spring也为这种语句提供了对应的配置语法: 调用getter方法:使用PropertyPathFactoryBean 调用类或对象的

【Intellij idea】spring中@Autowired注入失败

@Autowired注入失败失败的解决办法? 现有的解决的方案是: 打开file-settings或者ctrl+alt+s -> Editor 然后在Inspections 点击搜索栏 输入Spring Core 在Spring Core -> Code -> Autowring for Bean Class中将Severity的级别由之前的error改成warning. --------------------- 作者:小Sunny呀 来源:CSDN 原文:https://blog.c