Question

I code to interfaces as follows :

DAO interface :

public interface SampleTblDao extends BaseDao<SampleTbl> {

/**
* 
* @param mapper
* @param sampleKey
* @return
* @throws DataAccessException
*/
public SampleTbl selectSampleTbl(SampleKey sampleKey) throws DataAccessException;

}

DAO implementation

public class SampleTblDaoImpl extends AbstractBaseDao<SampleTbl, SampleTblMapper> implements SampleTblDao {

  public SampleTblDaoImpl() {
    super(SampleTblMapper.class);
  }

  @Override
  public SampleTbl selectSampleTbl(SampleKey sampleKey) throws DataAccessException {
    return getSqlSession().getMapper(SampleTblMapper.class).selectSampleTbl(sampleKey);
  }

}

Business-logic interface :

public interface SampleBusinessLogic {

  /**
   * 
   * @param sample
   * @return
   * @throws SampleException
   */
  public Sample createSample(Sample sample) throws SampleException;

  /**
   * 
   * @param sample
   * @return
   * @throws SampleException
   */
   public Sample updateSample(Sample sample) throws SampleException;

  /**
   * @param sampleKey
   * @return
   * @throws SampleException
   */
   public Sample getSample(SampleKey sampleKey) throws SampleException;

   }

Business-logic implementation :

 public class SampleBusinessLogicImpl implements SampleBusinessLogic {

    /**
     * sample table dao
     */
    @Autowired
    @Qualifier(value = "sampleTblDao")
    private SampleTblDao sampleTblDao;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Sample createSample(Sample sample) throws SampleException {

        try {
            // sample table
            createSampleTbl(sample.getSampleTbl());

        } catch (Exception e) {

            List < String > messageList = new ArrayList < String > ();
            String message = "{createSample : " + "{itemId=" + sample.getSampleTbl().getItemId() + "}," + "{itemName=" + sample.getSampleTbl().getItemName() + "}}";

            messageList.add("createShop system error");

            throw new SampleException(message, messageList, e);

        }

        return sample;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Sample updateSample(Sample sample) throws SampleException {

        List < String > messageList = null;
        String message = null;

        try {

            // global shop table
            updateSampleTbl(sample.getSampleTbl());

        } catch (IllegalDataException e) {

            message = "{updateSample : " + "{itemId=" + sample.getSampleTbl().getItemId() + "}," + "{itemName=" + sample.getSampleTbl().getItemName() + "}}";

            messageList = new ArrayList < String > ();
            messageList.add("updateSample illegal data error");

            throw new SampleException(message, messageList, e);

        } catch (Exception e) {

            message = "{updateSample : " + "{itemId=" + sample.getSampleTbl().getItemId() + "}," + "{itemName=" + sample.getSampleTbl().getItemName() + "}}";

            messageList = new ArrayList < String > ();
            messageList.add("updateSample system error");

            throw new SampleException(message, messageList, e);

        }

        return sample;

    }

    @Override
    @Transactional(rollbackFor = Exception.class, readOnly = true)
    public Sample getSample(SampleKey sampleKey) throws SampleException {

        Sample sample = new Sample();

        String message = null;
        List < String > messageList = null;

        try {

            sample.setSampleTbl(getSampleTbl(sampleKey));

        } catch (DataNotFoundException e) {

            message = "{getSample : " + "{itemId=" + sampleKey.getItemId() + "}}";

            messageList = new ArrayList < String > ();
            messageList.add("getSample data not found error");

            throw new SampleException(message, messageList, e);

        } catch (Exception e) {

            message = "{getSample : " + "{itemId=" + sampleKey.getItemId() + "}}";

            messageList = new ArrayList < String > ();
            messageList.add("getSample system error");

            throw new SampleException(message, messageList, e);

        }

        return sample;
    }

    /**
     *
     * @param sampleTbl
     * @throws Exception
     */
    private void createSampleTbl(SampleTbl sampleTbl) throws Exception {

        sampleTbl.setItemId(new UUID().toString());
        sampleTblDao.insert(sampleTbl);
    }

    /**
     * @param sampleTbl
     * @throws Exception
     */
    private void updateSampleTbl(SampleTbl sampleTbl) throws Exception {

        if (sampleTbl.isTransactionTarget(SampleTbl.class)) {

            String message = null;
            SampleKey sampleKey = new SampleKey();
            sampleKey.setItemId(sampleTbl.getItemId());

            SampleTbl sampleTblPre = sampleTblDao.selectSampleTbl(sampleKey);

            if (sampleTblPre == null) {
                // if sample table is empty
                message = "{illegal data error:{sampleTblPre=null}}";
                throw new IllegalDataException(message);
            }

            sampleTbl.setItemId(sampleTblPre.getItemId());
            sampleTblDao.update(sampleTbl);

        }

    }

    /**
     * @param sampleKey
     * @return
     * @throws Exception
     */
    private SampleTbl getSampleTbl(SampleKey sampleKey) throws Exception {

        String message = "";

        SampleTbl sampleTbl = sampleTblDao.selectSampleTbl(sampleKey);

        if (sampleTbl == null) {
            // if sample tbl is empty
            message = "{data not found error:{SampleTbl=null}}";
            throw new DataNotFoundException(message);
        }

        return sampleTbl;
    }

    public void setSampleTblDao(SampleTblDao sampleTblDao) {
        this.sampleTblDao = sampleTblDao;
    }
}

In the application context XML I have configured beans as follows :

<bean id="sampleTblDao" class="com.rakuten.gep.sample.dao.impl.SampleTblDaoImpl" parent="baseDAO" scope="singleton">
        <property name="namespace" value="com.rakuten.gep.sample.dao.mapper.SampleTblMapper" />
</bean>
<bean id="sampleBusinessLogic" class="com.rakuten.gep.sample.businesslogic.impl.SampleBusinessLogicImpl" scope="singleton"/>

<!-- and annocation based transaction is configured as follows -->
<tx:annotation-driven transaction-manager="trx-manager" proxy-target-class="true" />

<bean id="trx-manager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource"/>
</bean>

But after debugging, I realized that in the autowired field 'sampleTblDao' in 'SampleBusinessLogicImpl' is always null.

Any tips?

Was it helpful?

Solution

You are configuring things in XML and rely (partially) on annotations. By default spring ignores all annotations like @Autowired, @Inject and the likes. To enable processing of these annotations an instance of the AutowiredAnnotationBeanPostProcessor and CommonAnnotationBeanPostProcessor (the latter is for @Resource and other JSR-250 annotation processing) need to be registered.

This can be done manually or by using the namespace.

<context:annotation-config />

When using a <context:component-scan /> it is already implied that one wants to use annotations for configuration and as such the functionality of <context:annotation-config /> is already included, so no need to add it again.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top