不确定我做错了什么,但我有一个 webapp 配置可以在单元测试中工作,但在组件 bean 的生产中就死了。
bean 扩展了 WebServiceGatewaySupport
并扩展了一个接口(interface)。
我是这样在java中定义的:
@Component("myShippingImplementation")
public class MyShippingImplemenation extends WebServiceGatewaySupport implements ShippingImplementation {
private String addressValidationUri;
public String getAddressValidationUri() {
return addressValidationUri;
}
public void setAddressValidationUri(String addressValidationUri) {
this.addressValidationUri = addressValidationUri;
}
}
XML bean 配置是:
<bean id="myShippingImplementation" class="com.cerp.service.shipping.MyShippingImplemenation" autowire="byType">
<property name="addressValidationUri" value="https://www.testurl.com" />
<property name="defaultUri" value="https://www.alturl.com" />
<property name="marshaller" ref="marshaller"/>
<property name="unmarshaller" ref="marshaller"/>
</bean>
如果我在单元测试中连接它,它会工作:
public class MyServiceClientTest extends BaseWebServiceTest {
@Autowired MyShippingImplemenation c;
(BaseWebServiceTest使用SpringJUnit4ClassRunner)
但是如果我将它连接到 Controller 中并使用以下命令在 Tomcat 上运行它:
@Controller
@RequestMapping(value="/work/settings")
public class SettingsController {
@Autowired
SignupServiceI signupService;
@Autowired
ShippingImplementation myShipImplementation;
它死了。问题是我在 XML 中定义的字段似乎不是自动连接到 Controller 的 bean 的一部分。例如,我在 setAddressValidationUri
中放置了一个断点,我可以看到它在应用程序启动时使用适当的属性调用。但是,在 Controller 中 Autowiring 之后,bean 的实例对于这些值具有 null。
您还会注意到有一个 SignupServiceI
引用...这是一个成功 Autowiring 的服务 bean。它是由用 @Service
标记注释的类实现的接口(interface)。
最佳答案
删除@Component
。
添加此注释并结合组件扫描会导致同一 bean 的两个实例(实际上在您的情况下,由于相同的 bean 名称/id,一个 bean 覆盖了另一个)。您还用 XML 定义了它。 XML 中的那个就是您要使用的那个。
关于java - Spring bean 不使用@Component 注释 Autowiring ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23623398/