注入
@Service
public class FgStoServiceImpl implements FgStoService {
@Resource
private PrintInvoiceService printInvoiceService;
public TransResult printVNPT(OdsProStoHvDetail condition) {
PublishServiceSoap publishServiceSoap = printInvoiceService.getPublishServiceSoap();
...
}
定义的普通类(这种普通类有20多个,是不是只能是都加上component注解?)
package com.haier.cosmo.wms.cp.out.service.service.printInvoiceService;
import java.net.MalformedURLException;
import java.net.URL;
public class PrintInvoiceService {
private PublishServiceSoap publishServiceSoap;
public PublishServiceSoap getPublishServiceSoap() {
String url = "https://aquavn-tt78admindemo.vnpt-invoice.com.vn/PublishService.asmx";
if (publishServiceSoap != null) {
return publishServiceSoap;
}
try {
URL uurl = new URL(url);//URL在配置文件中动态配置
PublishService mobileCodeWS = new PublishService(uurl);
publishServiceSoap = mobileCodeWS.getPublishServiceSoap();
} catch (MalformedURLException e) {
e.printStackTrace();
}
return publishServiceSoap;
}
}
报错
Description:
A component required a bean of type 'com.haier.cosmo.wms.cp.out.service.service.printInvoiceService.PrintInvoiceService' that could not be found.
Action:
Consider defining a bean of type 'com.haier.cosmo.wms.cp.out.service.service.printInvoiceService.PrintInvoiceService' in your configuration.
建议先自己好好学学spring、springboot再来提问,一些基础的问题也可以直接百度
不一定但一般是这样的。如果你需要让Spring来管理你定义的类,你就需要首先把这些bean放进Spring的容器里交给Spring来管理,诸如@Component/@Controller/@Service/@Repository其实本质上都是一样的,就是把这个类的对象或者实现这个接口的类的对象交给Spring容器来管理。
一个可能不太恰当的比喻:你可以理解为没加注解的类是水龙头里的水,每次你要用水都得自己打开水龙头,加上这些注解的类是被装进水瓶里的水,你要用的时候只要从水瓶里倒水就可以了,前提是你得往这个水瓶里装水。
另外我注意到你的这个普通类里面:
PublishService mobileCodeWS = new PublishService(uurl);
如果你要给这个普通类加上@Component注解,这里的写法也就相应地要变化,PublishService也要加上@Component/@Service,再通过@Resource/@Autowired注入这个已经加上@Component的普通类里(现在已经是交给Spring管理的类了),如果你的类里还有这种new的对象,就要一路改下去直到没有这种情况为止。
当然了,你如果非要在一个已经交给Spring管理的类里new对象,然后还要通过Spring容器拿到这个bean,就不能采用注入的方式了,不然会报空指针异常,这里我提供一个工具类:
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
/**
* 服务器启动,Spring容器初始化时,当加载了当前类为bean组件后,
* 将会调用下面方法注入ApplicationContext实例
*/
@Override
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
System.out.println("Spring容器初始化了");
SpringUtils.applicationContext = arg0;
}
public static ApplicationContext getApplicationContext(){
return applicationContext;
}
/**
* 外部调用这个getBean方法就可以手动获取到bean
* 用bean组件的name来获取bean
* @param beanName
* @return
*/
@SuppressWarnings("unchecked")
public static <T>T getBean(String beanName){
return (T) applicationContext.getBean(beanName);
}
}
调用它的getBean方法就能拿到你那个里面有new对象的bean了:
//我假设你非要保留PrintInvoiceService里的PublishService mobileCodeWS = new PublishService(uurl)不可
PrintInvoiceService printInvoiceService = springUtils.getBean("printInvoiceService");
其实本质上就是直接拿到容器对象,然后调用容器的getBean方法“手动”来拿到我们想要的bean罢了,这种方式适用于在一些不能被Spring管理的类里非得用到Spring管理的类的对象时。
希望我的回答对你有所帮助。
报错信息 yml配置
所以我有一个简单的java类: ClassA包含: B类: 我的测试设置如下所示: 问题是ClassB不是为ClassA注入的。 然后通过classA调用returnObject(ClassB),它返回NullPointerException(ClassB不是模拟/注入的)。 如果通过IWantToTestThisClass调用returObject(class B),则可以。 这是同时为两个类注
问题是我写了简单的注释处理器,它根本不处理类型注释。simple annotations processor的源代码如下所示: 有什么想法如何使用或如何通过SimpleAnnotationsProcessor访问类型注释吗?使用可插入的注释处理API对我来说是不必要的,我认为它会比Java反射有更好的性能。无论如何,我也不知道如何通过Java反射访问类型注释。
我在学习java软件包。我创建了两个包,“main”和“main2”。两个包都有一个同名的类。在这两个类中,我还有一个同名的方法。目前,我正在与包“主要”。 见以下代码: “主”包 “main2”包 在这里我目前正在使用包“main”。在这里我也在导入包“main 2”。现在我想创建一个“main 2”包的“ok”类的对象。由于“main”包已经有一个名为ok的类和相同的方法名,所以它没有调用包m
不修改服务器的java.security情况下,如何仅仅通过代码层面的修改(修改连接,加参数等)解决报错问题? 在公司,我无权做服务器的修改,仅能修改代码 报错如下
在我的一个Vaadin视图中,我试图通过使用@Inject注入驻留在另一个项目(bll)中的业务对象来获取它。 瓦丁观点: 我不能这样做,当然,bananaService对象在运行时是空的,因为我没有地方对包进行组件扫描。 我正在使用注释,所以我没有web.xml在我的Vaadin Web项目中,我甚至没有WEB-INF文件夹。 我也知道有一些替代方案,比如CDI-Utils和Vaadin CDI