验证拦截器错误消息未在Backoffice中显示

2020-08-15 00:31发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,我已经在我的产品上创建了一个验证拦截器

公共类MyProductValidatorInterceptor实现ValidateInterceptor
 {
   @Override
   公共无效onValidate(最终对象模型,最终InterceptorContext ctx)抛出InterceptorExceptio
  {
     如果(模型实例为MyProductModel
         &&(ctx.isNew(model)|| ctx.isModified(model,ChemicalProductModel.APPROVALSTATUS)))
     {
        最终的MyProductModel myProductModel =(MyProductModel)模型;
        最终ArticleApprovalStatus批准状态= chemicalProductModel.getApprovalStatus();
        如果(ArticleApprovalStatus.APPROVED == rova​​lStatus)
        {
          抛出新的InterceptorException("
             由于没有必填字段,因此无法将产品保存在批准中");
        }
    }
  }
 }
 

但是后台办公室会显示一般错误消息

我如何显示我的错误消息?

(55.3 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,我已经在我的产品上创建了一个验证拦截器

公共类MyProductValidatorInterceptor实现ValidateInterceptor
 {
   @Override
   公共无效onValidate(最终对象模型,最终InterceptorContext ctx)抛出InterceptorExceptio
  {
     如果(模型实例为MyProductModel
         &&(ctx.isNew(model)|| ctx.isModified(model,ChemicalProductModel.APPROVALSTATUS)))
     {
        最终的MyProductModel myProductModel =(MyProductModel)模型;
        最终ArticleApprovalStatus批准状态= chemicalProductModel.getApprovalStatus();
        如果(ArticleApprovalStatus.APPROVED == rova​​lStatus)
        {
          抛出新的InterceptorException("
             由于没有必填字段,因此无法将产品保存在批准中");
        }
    }
  }
 }
 

但是后台办公室会显示一般错误消息

我如何显示我的错误消息?

(55.3 kB)
付费偷看设置
发送
7条回答
d56caomao
1楼 · 2020-08-15 00:58.采纳回答

我通过更改方法解决了问题,我创建了一个自定义的TypeConstraint验证

公共类ApprovedProductValidator实现ConstraintValidator 
 {
   @Override
   公共布尔isValid(最终对象模型,最终ConstraintValidatorContext arg1)
   {
     如果(MyProductModel的模型实例)
     {
       最终的MyProductModel myProduct =(MyProductModel)模型;
       最终ArticleApprovalStatus批准状态= chemicalProductModel.getApprovalStatus();
       如果(ArticleApprovalStatus.APPROVED == rova​​lStatus)
       {
         .....
         返回false;
       }
     }
     返回true;
 }
 

现在保存被阻止,显示一条消息

jovirus
2楼-- · 2020-08-15 00:48

您好Crescenzo,您使用的是1905吗?

木偶小白
3楼-- · 2020-08-15 00:55

您好,Crescenzo ,

我有同样的问题。 我曾经使用相同的方法在Backoffice中显示自定义错误消息...

引发新的InterceptorException("我的自定义错误消息")

因此,这似乎是1905版中弹出的一个"新"问题。?!

您使用哪个版本?

SAP/Hybris对此有何评论?

最诚挚的问候!

Torsten

spaceman01
4楼-- · 2020-08-15 00:53

是的,我将版本1905.13与hybris-cloud-extension-pack-1905.2004一起使用

暮风yp
5楼-- · 2020-08-15 00:58

托伦·洛伦兹

要显示自定义消息,请尝试使用

如果(有条件){
  context.disableDefaultConstraintViolation();
  context.buildConstraintViolationWithTemplate("我的错误消息").addConstraintViolation();
  返回false;
 }
 

此致

Crescenzo

超级大咸鱼
6楼-- · 2020-08-15 00:54

非常感谢Crescenzo。

但是我想坚持使用原始方法,因为我不想更改项目中所有现有的Interceptor(使用自定义消息抛出InterceptorException)和单元测试。

公共类CustomerXInterceptor实现ValidateInterceptor  {
     @Override
     公共无效onValidate(最终CustomerModel客户,最终InterceptorContext ctx)
             引发InterceptorException {
         如果(条件){
             抛出新的InterceptorException("我的自定义错误消息");
         }
     }
 }
 
独立观察员
7楼-- · 2020-08-15 00:53

ModelSavingExceptionTranslationHandler上toString方法的实现,负责解决出现ModelSavingException时在bakoffice中显示的错误消息,在版本1905中已更改。 >

Hybris在内部捕获所有InterceptorExeptions,然后重新抛出ModelSavingException,并以异常为原因。

1905年版本的实现如下:

公共字符串toString(可抛出异常){
     返回this.getLabelByKey(" unexpected.update.error");
 } 

通过此实现,无论原因是什么,错误消息将始终相同。

为了进行比较,6.4中的实现显示了抛出异常的详细消息,如下所示:

公共字符串toString(可抛出异常){
     ModelSavingException modelSavingException =(ModelSavingException)(ModelSavingException的例外实例?exception:exception.getCause());
     字符串messageByCause = this.translateByCause(modelSavingException.getCause());
     字符串消息=(String)StringUtils.defaultIfBlank(messageByCause,modelSavingException.getLocalizedMessage());
     返回StringUtils.capitalize((String)StringUtils.defaultIfBlank(message,"")));
 } 

这应该是一个错误,因为文档 1905年仍然说将显示抛出异常的消息,否则文档不是最新的。

可以通过重写ModelSavingExceptionTranslationHandler来解决此问题,但这会影响Hole平台,我们还不知道为什么首先要更改实现。 因此,更明智的是向SAP支持人员报告此事。

一周热门 更多>