我不确定我做错了什么,但我有一个在单元测试中工作的webapp配置,但在生产中死于Component bean。
bean扩展WebServiceGatewaySupport
并扩展了接口。
我在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)
但如果我在控制器中连接它并使用以下命令将其从Tomcat运行:
@Controller
@RequestMapping(value="/work/settings")
public class SettingsController {
@Autowired
SignupServiceI signupService;
@Autowired
ShippingImplementation myShipImplementation;
它死了。问题是我在XML中定义的字段似乎不是自动装入Controller的bean的一部分。例如,我在setAddressValidationUri
中放置了一个断点,我可以看到它在具有适当属性的应用程序启动时被调用。但是,在控制器中自动装配之后,bean的实例对于这些值为null。
您还会注意到有一个SignupServiceI
引用...这是一个成功自动装配的Service bean。它是由使用@Service
标记注释的类实现的接口。
答案 0 :(得分:10)
删除@Component
。
添加此注释与组件扫描相结合会导致同一个bean的两个实例(实际上在您的情况下,由于相同的bean名称/ id,一个bean会覆盖另一个bean)。您还使用XML定义了它。 XML中的那个是您要使用的那个。