0

私は主題が初めてです

私は構成を持っています

そしてそれを注入してみてください

@Controller 
public class HelloController {
    @Autowired
    HibernateTemplate hibernateTemplate;

    @RequestMapping(value = "/hello.htm", method = RequestMethod.GET)  
    public @ResponseBody String save() throws Exception {
       hibernateTemplate.save(new Some(Long.valueOf("33"), Integer.valueOf("1"), Double.valueOf("1"), Short.valueOf("0")));    
    }
}

それは動作します。

しかし、他のクラスで@Autowiredを使おうとすると、NPEの例があります

public class SomeFacade extends AbstractFacade<Some> {

    @Autowired
    HibernateTemplate hibernateTemplate;

    @Override
    public HibernateTemplate getHibernateTemplate() {
        return hibernateTemplate;
    }

}

でそれを使用します

@Controller 
public class HelloController {

    @RequestMapping(value = "/hello.htm", method = RequestMethod.GET)  
    public @ResponseBody String save() throws Exception {
        SomeFacade df = new SomeFacade();
        HibernateTemplate ht = df.getHibernateTemplate();
    }
}

そして、私は「ht」がNullである

そのコードで何が起こっているのか、なぜそれが機能しないのかわかりません。私のクラスがxmlファイルに登録されていないためだと思います。その例を手伝ってください。ありがとう!

4

1 に答える 1

1

@GreybeardedGeekが言ったように、Spring Beanである必要があります。@Component アノテーションをクラスに追加して、 spring によって管理されるようにすることができます。

@Component
public class SomeFacade extends AbstractFacade<Some> {

    @Autowired
    HibernateTemplate hibernateTemplate;

    @Override
    public HibernateTemplate getHibernateTemplate() {
        return hibernateTemplate;
    }

}

component-scan が xml ファイル (ルート コンテキスト) にまだ存在しない場合は、忘れずに追加してください。

<context:component-scan base-package="your.package" />

このソリューションを使用している場合は、 new キーワードを使用する代わりにコンポーネントを挿入します。

@Controller 
public class HelloController {

    @Autowired
    private SomeFacade df;

    @RequestMapping(value = "/hello.htm", method = RequestMethod.GET)  
    public @ResponseBody String save() throws Exception {
        HibernateTemplate ht = df.getHibernateTemplate();
    }
}
于 2013-01-07T00:23:00.430 に答える