Java Spring自动连线声明的问题
我正试图按照Petri Kainulainen的《Spring数据》一书中的示例代码创建一个应用程序。我有一个服务寄存联系服务 包com.packtpub.springdata.jpa.serviceJava Spring自动连线声明的问题,java,spring,autowired,Java,Spring,Autowired,我正试图按照Petri Kainulainen的《Spring数据》一书中的示例代码创建一个应用程序。我有一个服务寄存联系服务 包com.packtpub.springdata.jpa.service @Service("service") public class RepositoryContactService implements ContactService { My ApplicationContext类将服务包设置为扫描 @Configuration @ComponentScan(
@Service("service")
public class RepositoryContactService implements ContactService {
My ApplicationContext类将服务包设置为扫描
@Configuration
@ComponentScan(basePackages = { "com.packtpub.springdata.jpa.service" })
@EnableTransactionManagement
@EnableWebMvc
@EnableJpaRepositories("com.packtpub.springdata.jpa.repository")
@PropertySource("classpath:application.properties")
public class ApplicationContext extends WebMvcConfigurerAdapter {
我正在运行带有声明的类测试
@Autowired
private static RepositoryContactService service;
并在main方法中编写代码
Contact contact = new Contact("handro1104@gmail.com", "handro");
service.save(contact);
问题是线路service.savecontact;给我的服务是空的 从注释为@Service的类只创建一个bean,因为@Service的默认方式是单例的,所以您不需要静态地自动连接这些类bean 更改:
@Autowired
private static RepositoryContactService service;
致:
Spring无法自动连线RepositoryContactService的原因可能有很多 RepositoryContactService不在@ComponentScan中声明的包中。为此,请尝试添加RepositoryContactService所在的包 ContactService出现在@ComponentScan中的列表中。 你已经写了,你已经写了课堂测试。如果它是一个单元测试类,那么检查用于单元测试的所有注释是否存在。
虽然这不能解决空值问题,但我更喜欢编程接口,并使用限定符告诉spring容器要注入接口的哪个实现。感谢所有响应者。我发现您无法自动关联静态字段,并尝试
@Component
public class Test {
@Autowired
private ContactService service;
public static void main(String[] args) {
Test test = new Test();
Contact contact = new Contact("handro1104@gmail.com", "handro");
ContactService service = test.service;
service.save(contact);
}
但这也不起作用。我也试过了
public class Test {
public static void main(String[] args) {
ContactService service = new RepositoryContactService();
Contact contact = new Contact("handro1104@gmail.com", "handro");
service.save(contact);
}
与
但这里的存储库为空
为了更清楚,我有
@Configuration
@ComponentScan(basePackages = { "com.packtpub.springdata.jpa.service" })
@EnableTransactionManagement
@EnableWebMvc
@EnableJpaRepositories("com.packtpub.springdata.jpa.repository")
@PropertySource("classpath:application.properties")
public class ApplicationContext extends WebMvcConfigurerAdapter {
因此,可以扫描RepositoryContactService,并自动连接com.packtpub.springdata.jpa.repository中的ContactRepository。在某些时候,我甚至将com.packtpub.springdata.jpa.repository添加到@ComponentScan中。请显示测试类的声明和所有注释。Spring不会@Autowire静态变量-因此您的整体设置无效。您需要创建一个类来保存RepositoryContactService,main将通过Spring的应用程序上下文调用,这样Spring才能帮助您进行设置。
@Resource // Also tried with @Autowired
private ContactRepository repository;
@Configurable
public class RepositoryContactService implements ContactService {
@Override
public void save(Contact updated) {
repository.save(updated);
}
@Configuration
@ComponentScan(basePackages = { "com.packtpub.springdata.jpa.service" })
@EnableTransactionManagement
@EnableWebMvc
@EnableJpaRepositories("com.packtpub.springdata.jpa.repository")
@PropertySource("classpath:application.properties")
public class ApplicationContext extends WebMvcConfigurerAdapter {