[
https://issues.apache.org/jira/browse/OFBIZ-1141?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Wickersheimer Jeremy updated OFBIZ-1141:
----------------------------------------
Attachment: ofbiz-1141-example3.patch
This illustrates the Exception interception approach.
- there is a custom utility class (UtilException) in entity.util [this can be
chnage to whatever more convenient/standard location/name]
- then a small patch of StoreValue and CreateValue to process the Exception and
if it could be handled by UtilException changes the message to be displayed to
the one built by UtilException
As i feared the parsing will have to adapt to different DB systems, for example
in Postgres the message contains the Detail of the FK violation which means i
can retrieve the Table where the data is missing.. but in Derby i don't have
that information so i adapted the code to fallback to the simple FK violation
description which in both cases only gives me the Values and the FK name.
If people are interested they can try with other DBs (MySQL, Oracle, ...)
It also relies on the SQLState which should be 23503 for a FK violation, i read
that some version of MySQL returns 23000 for all 23*** states...
But anyway, if the state doesn't match OR the regex fail, then it falls back to
the previous behavior.
> More user friendly error messages
> ---------------------------------
>
> Key: OFBIZ-1141
> URL: https://issues.apache.org/jira/browse/OFBIZ-1141
> Project: OFBiz
> Issue Type: Improvement
> Affects Versions: SVN trunk, Release Branch 4.0
> Reporter: Wickersheimer Jeremy
> Priority: Minor
> Attachments: ofbiz-1141-example1.patch, ofbiz-1141-example2.patch,
> ofbiz-1141-example3.patch
>
>
> A lot of error messages in Ofbiz are "cryptic" for normal users. For example
> sometimes a user would trigger a database foreign key violation and as a
> result will have a quite big error message thrown at him.
> This would happen for example when you create an Agreement then gives both a
> Party Id To and a Role Type Id To that doesn't match.
> In that case the error is something like:
> ERROR: Could not complete the Create an Agreement
> [file:/home/jeremy/bertelsmann/dgerp/applications/accounting/script/org/ofbiz/accounting/agreement/AgreementServices.xml#createAgreement]
> process [problem creating the newEntity value: Exception while inserting the
> following entity:
> [GenericEntity:Agreement][agreementDate,null()][agreementId,10076(java.lang.String)][agreementTypeId,null()][createdStamp,2007-07-12
> 12:33:38.285(java.sql.Timestamp)][createdTxStamp,2007-07-12
> 12:33:38.283(java.sql.Timestamp)][defaultCurrencyUomId,null()][description,null()][fromDate,2007-07-12
>
> 12:33:38.285(java.sql.Timestamp)][fromPartyClassGroupId,null()][lastUpdatedStamp,2007-07-12
> 12:33:38.285(java.sql.Timestamp)][lastUpdatedTxStamp,2007-07-12
> 12:33:38.283(java.sql.Timestamp)][partyIdFrom,null()][partyIdTo,Admin(java.lang.String)][productId,null()][roleTypeIdFrom,null()][roleTypeIdTo,PERSON_ROLE(java.lang.String)][statusId,null()][textData,null()][thruDate,null()][toPartyClassGroupId,null()]
> (while inserting:
> [GenericEntity:Agreement][agreementDate,null()][agreementId,10076(java.lang.String)][agreementTypeId,null()][createdStamp,2007-07-12
> 12:33:38.285(java.sql.Timestamp)][createdTxStamp,2007-07-12
> 12:33:38.283(java.sql.Timestamp)][defaultCurrencyUomId,null()][description,null()][fromDate,2007-07-12
>
> 12:33:38.285(java.sql.Timestamp)][fromPartyClassGroupId,null()][lastUpdatedStamp,2007-07-12
> 12:33:38.285(java.sql.Timestamp)][lastUpdatedTxStamp,2007-07-12
> 12:33:38.283(java.sql.Timestamp)][partyIdFrom,null()][partyIdTo,Admin(java.lang.String)][productId,null()][roleTypeIdFrom,null()][roleTypeIdTo,PERSON_ROLE(java.lang.String)][statusId,null()][textData,null()][thruDate,null()][toPartyClassGroupId,null()]
> (SQL Exception while executing the following:INSERT INTO public.AGREEMENT
> (AGREEMENT_ID, PRODUCT_ID, PARTY_ID_FROM, PARTY_ID_TO, ROLE_TYPE_ID_FROM,
> ROLE_TYPE_ID_TO, AGREEMENT_TYPE_ID, AGREEMENT_DATE, FROM_DATE, THRU_DATE,
> DESCRIPTION, TEXT_DATA, LAST_UPDATED_STAMP, LAST_UPDATED_TX_STAMP,
> CREATED_STAMP, CREATED_TX_STAMP, STATUS_ID, DEFAULT_CURRENCY_UOM_ID,
> FROM_PARTY_CLASS_GROUP_ID, TO_PARTY_CLASS_GROUP_ID) VALUES (?, ?, ?, ?, ?, ?,
> ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) (ERROR: insert or update on table
> "agreement" violates foreign key constraint "agrmnt_tprtyrle"
> Detail: Key (party_id_to,role_type_id_to)=(Admin,PERSON_ROLE) is not present
> in table "party_role".)))]
> It is fine for a developer who can understand that, but not for a user.
> I agree that with some hacking or better design in the forms it would be
> possible to avoid that kind of error, but the idea would be to be able to
> catch that and replace the error we something more understandable, for
> example:
> ERROR: the "Party Id To" doesn't have the "Role Type To Id" you entered.
> Or better:
> ERROR: the "Party Id To: Admin" doesn't have the "Role Type To Id: Person".
> Possible values for the Role Type are : "..."
> I know that such a feature cannot be implemented in the framework directly
> because errors are context sensitive, so it would have to be done in the
> Service XML definition.
> Perhaps some new methods could be added in simple-methods to make that task
> easier ?
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.