Did you forget to reset your error/validate status of item in your BAdI implementation (not an exit...) like in following sample?
* Remove previous message
mmpur_context mmcnt_context_badi.
IFNOT ls_item-id ISINITIAL.
mmpur_remove_msg_by_context ls_item-id mmcnt_context_badi.
ENDIF.
* here some check set an error and invalidate item
IF ls_material_plant-mmsta EQ'30'.
im_item->invalidate().
mmpur_metafield mmmfd_matnr.
mmpur_message_forced 'E''ZXXX''999'<itemdata>-matnr <itemdata>-werks space space.
ENDIF.
Regards,
Raymond