简体   繁体   中英

Spring Integration Bean error

So I have this code, what I'm trying to do is to receive stamp orders from the front end of the web app. After I received the stamp orders. I'll split the orders into single stamp orders then filter them to approved and disapproved stamp orders. After filtering them, I'll send an email to the recipient about their stamp orders.

Here is my StampOrder.java

private BigInteger refId;
private TaxpayerInfo taxpayerInfo;
private StampPrintingStatus stampStatus;
private Date transDate;
private int transType;
private int paymentRefNo;
private BigDecimal totalPrintingCost;
private BigDecimal totalEtEmt;
private String apoPurchaseOrder;
private Market market;
private Users user;
private List<StampOrderDetails> listOfStampOrder;


public StampOrder(){

}


public StampOrder(BigInteger refId, TaxpayerInfo taxpayerInfo,
        StampPrintingStatus stampStatus, Date transDate, int transType,
        int paymentRefNo, BigDecimal totalPrintingCost,
        BigDecimal totalEtEmt, String apoPurchaseOrder, Market market,
        Users user, List<StampOrderDetails> listOfStampOrder) {
    this.refId = refId;
    this.taxpayerInfo = taxpayerInfo;
    this.stampStatus = stampStatus;
    this.transDate = transDate;
    this.transType = transType;
    this.paymentRefNo = paymentRefNo;
    this.totalPrintingCost = totalPrintingCost;
    this.totalEtEmt = totalEtEmt;
    this.apoPurchaseOrder = apoPurchaseOrder;
    this.market = market;
    this.user = user;
    this.listOfStampOrder = listOfStampOrder;
}

public boolean isApproved(){
    if(stampStatus.getStatusId()==3){
        return true;
    }else{
        return false;
    }
}

public BigInteger getRefId() {
    return refId;
}
public void setRefId(BigInteger refId) {
    this.refId = refId;
}
public TaxpayerInfo getTaxpayerInfo() {
    return taxpayerInfo;
}
public void setTaxpayerInfo(TaxpayerInfo taxpayerInfo) {
    this.taxpayerInfo = taxpayerInfo;
}
public StampPrintingStatus getStampStatus() {
    return stampStatus;
}
public void setStampStatus(StampPrintingStatus stampStatus) {
    this.stampStatus = stampStatus;
}
public Date getTransDate() {
    return transDate;
}
public void setTransDate(Date transDate) {
    this.transDate = transDate;
}
public int getTransType() {
    return transType;
}
public void setTransType(int transType) {
    this.transType = transType;
}
public int getPaymentRefNo() {
    return paymentRefNo;
}
public void setPaymentRefNo(int paymentRefNo) {
    this.paymentRefNo = paymentRefNo;
}
public BigDecimal getTotalPrintingCost() {
    return totalPrintingCost;
}
public void setTotalPrintingCost(BigDecimal totalPrintingCost) {
    this.totalPrintingCost = totalPrintingCost;
}
public BigDecimal getTotalEtEmt() {
    return totalEtEmt;
}
public void setTotalEtEmt(BigDecimal totalEtEmt) {
    this.totalEtEmt = totalEtEmt;
}
public String getApoPurchaseOrder() {
    return apoPurchaseOrder;
}
public void setApoPurchaseOrder(String apoPurchaseOrder) {
    this.apoPurchaseOrder = apoPurchaseOrder;
}

public Market getMarket() {
    return market;
}
public void setMarket(Market market) {
    this.market = market;
}
public Users getUser() {
    return user;
}
public void setUser(Users user) {
    this.user = user;
}
public List<StampOrderDetails> getListOfStampOrder() {
    return listOfStampOrder;
}
public void setListOfStampOrder(List<StampOrderDetails> listOfStampOrder) {
    this.listOfStampOrder = listOfStampOrder;
}
@Override
public String toString() {
    return "StampOrder [refId=" + refId + ", taxpayerInfo=" + taxpayerInfo
            + ", stampStatus=" + stampStatus + ", transDate=" + transDate
            + ", transType=" + transType + ", paymentRefNo=" + paymentRefNo
            + ", totalPrintingCost=" + totalPrintingCost + ", totalEtEmt="
            + totalEtEmt + ", apoPurchaseOrder=" + apoPurchaseOrder
            + ", market=" + market + ", user=" + user
            + ", listOfStampOrder=" + listOfStampOrder + "]";
}

Here is my spring integration schema xml

<context:component-scan base-package="com.irsis.integration.mail" />

<!-- logger -->
<int:logging-channel-adapter id="logger"
    log-full-message="true" level="INFO" />

<!-- gateway -->
<int:channel id="newStampAuthChannel" />

<!-- Gateway Java -->

<int:gateway id="stampAuthGateway"
    service-interface="com.irsis.integration.mail.StampAuthGateway">
    <int:method name="receivedStampsAuth" request-channel="newStampAuthChannel" />
</int:gateway>

<!-- Splitter = Multiple Orders To Single Orders // Creates new Channel 
    for Single Orders -->

<int:splitter input-channel="newStampAuthChannel"
    output-channel="singleStampAuthChannel" />

<int:channel id="singleStampAuthChannel" />

<!-- Filter = Filter ORders to approved or disapproved// Creates new Channel 
    for both -->

<int:filter input-channel="singleStampAuthChannel"
    output-channel="filteredStampAuthChannel" ref="stampAuthFilter" />

<int:channel id="filteredStampAuthChannel"/>


<!-- Router  -->


<int:recipient-list-router input-channel="filteredStampAuthChannel">
    <int:recipient channel="ApprovedOrderCreator"
        selector-expression="payload.approved" />
    <int:recipient channel="RejectedOrderCreator"
        selector-expression="!payload.approved" />
</int:recipient-list-router>

<int:channel id="ApprovedOrderCreator" />
<int:channel id="RejectedOrderCreator" />


<!-- TRANSFORMERS OBJECTS IN DISGUISE -->
<int:transformer input-channel="ApprovedOrderCreator"
    output-channel="sendChannel" ref="ApprovedOrderCreator" />

<int:transformer input-channel="RejectedOrderCreator"
    output-channel="sendChannel" ref="RejectedOrderCreator" />

<int:channel id="sendChannel">
    <int:queue capacity="1000" />
</int:channel>

<!-- Service Activator -->
<int:service-activator input-channel='sendChannel'
    ref='sendMailChannel' method="sendOrder">
</int:service-activator>

<import resource="classpath:/spring/application-context.xml"/>
<bean id="orderJob" class="com.irsis.integration.mail.OrderJob" />
    </beans>

The stampAuthGateway.java

public interface StampAuthGateway {
void receivedStampsAuth(List<StampOrder> order);}

The stampAuthFilter.java

@Component
public class StampAuthFilter {

@Filter
public boolean accept(Message<StampOrder> message){
    System.out.println("Filter Passed");
    StampOrder order = message.getPayload();
    boolean isApproved = order.getStampStatus().getStatusId() == 3;
    return isApproved;
}
}

The acceptCreatedOrders.java transformer

@Component
@Service("ApprovedOrderCreator")
@Transactional
public class ApprovedOrderCreator  {


    @Transformer
    public List<StampOrder> createOrder(Message<StampOrder> message) {
        System.out.println("Accept Transformer Pass");
        StampOrder order = message.getPayload();
        List<StampOrder> saList = new ArrayList<>();
        if (order.getStampStatus().getStatusId() == 3) {
            saList.add(order);
        }
        return saList;
    }}

the rejectOrderCreator.java transformer has the same code has above but with this condition

if(order.getStampStatus.getStatusId!=3)

the sendMailChannel.java service activator

    @Autowired
SendMailService sms;

@ServiceActivator
public void sendOrder(Message<StampOrder> message){
    StampOrder order = message.getPayload();
    if(order.getStampStatus().getStatusId()==3){
    sms.SendNotification(4, order.getTaxpayerInfo().getTinContactEAdd(), "blah");
    }else{
        sms.SendNotification(5, order.getTaxpayerInfo().getTinContactEAdd(), "blah");
    }

the stampOrderCreator interface

public interface StampOrderCreator {
List<StampOrder> createOrder(Message<StampOrder> message);
}

the orderJob.java

@Autowired
StampAuthGateway stampAuthGateway;

@Scheduled(fixedRate = 4000)
public void scheduledStampOrderHandling() {
    StampOrderGenerator sgo = new StampOrderGenerator();
    List<StampOrder> orderList = sgo.generateStampOrder();

    stampAuthGateway.receivedStampsAuth(orderList);

}

and the integration config xml

    <import resource="classpath:/integration/mi-batch-config.xml"/>
<import resource="classpath:/spring/application-context.xml"/>

<context:component-scan base-package="com.irsis.integration.mail" />

<task:executor id="executor" pool-size="10"/>
<task:scheduler id="scheduler" pool-size="10"/>
<task:annotation-driven executor="executor" scheduler="scheduler"/>

and when i'm running it here is the exception message that im getting

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.config.ConsumerEndpointFactoryBean#3': Cannot resolve reference to bean 'org.springframework.integration.config.TransformerFactoryBean#0' while setting bean property 'handler'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.config.TransformerFactoryBean#0': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Found ambiguous parameter type [interface org.springframework.integration.core.MessageHandler] for method match: [public void org.springframework.integration.context.IntegrationObjectSupport.setApplicationContext(org.springframework.context.ApplicationContext) throws org.springframework.beans.BeansException, public void org.springframework.integration.channel.AbstractMessageChannel.addInterceptor(org.springframework.integration.channel.ChannelInterceptor), public boolean org.springframework.integration.channel.AbstractSubscribableChannel.unsubscribe(org.springframework.integration.core.MessageHandler), public void org.springframework.integration.channel.AbstractMessageChannel.setConversionService(org.springframework.core.convert.ConversionService), public void org.springframework.integration.channel.AbstractMessageChannel.setInterceptors(java.util.List), public void org.springframework.integration.channel.DirectChannel.setMaxSubscribers(int), public void org.springframework.integration.context.IntegrationObjectSupport.setComponentName(java.lang.String), public java.lang.String org.springframework.integration.context.IntegrationObjectSupport.getApplicationContextId(), public void org.springframework.integration.channel.AbstractMessageChannel.setShouldTrack(boolean), public final void org.springframework.integration.context.IntegrationObjectSupport.setBeanFactory(org.springframework.beans.factory.BeanFactory), public void org.springframework.integration.channel.AbstractMessageChannel.setDatatypes(java.lang.Class[])]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:329)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1417)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1158)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:610)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.irsis.integration.test.BatchIntegrationTest.main(BatchIntegrationTest.java:14)

Sorry for the poor formatting was In a hurry posting this. Hope someone can help me.

Thank you, Jet

You have both a channel and a service called ApprovedOrderCreator ; the framework is trying to use the channel as a handler for the transformer.

You need to give these elements unique names.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM