Business object based on m_user failed hook prevalidate

Bonjour,
j’ai créé un objet métier basé sur la table m_user. Seulement je rencontre une erreur lorsque je tente de créer ou modifier une nouvelle instance d’objet :
Exception du runtime: NullPointerException (Cannot invoke "com.simplicite.util.ObjectField.isEmpty()" because "mdlId" is null)

dans les logs :

SIMPLICITE|http://demo.simplicite.io:20128||ECORED0001|designer|com.simplicite.util.engine.ObjectManager|validate||Erreur preValidate hook error
    java.lang.NullPointerException: Cannot invoke "com.simplicite.util.ObjectField.isEmpty()" because "mdlId" is null
2021-08-23 10:10:05,697 ERROR [com.simplicite.objects.HumanRessource.HrEmployee] SIMPLICITE|http://demo.simplicite.io:20128||ECORED0001|system|com.simplicite.objects.HumanRessource.HrEmployee|getField||Error Object HrEmployee: unknown field row_module_id.

Dans mon code javascript HrEmployee j’ai utilisé un hook postload que j’ai totalement commenté pour debbuguer, cela ne change rien :

	@Override
	public void postLoad() {
		super.postLoad();
		// hide most of the SimpleUser fields, keeping only email & login
	//	getField("usr_first_name").setVisible(ObjectField.VIS_HIDDEN);
	//	getField("usr_last_name").setVisible(ObjectField.VIS_HIDDEN);
	//	getField("usr_image_id").setVisible(ObjectField.VIS_HIDDEN);
		//getField("usr_email").setVisible(ObjectField.VIS_HIDDEN);
	//	getField("usr_lang").setVisible(ObjectField.VIS_HIDDEN);
	//	getField("usr_cell_num").setVisible(ObjectField.VIS_HIDDEN);
	//	getField("usr_active").setVisible(ObjectField.VIS_HIDDEN);
	//	getField("usr_home_id").setVisible(ObjectField.VIS_HIDDEN);
//		getField("row_module_id").setVisible(ObjectField.VIS_HIDDEN);
		
		// hide all users that were not created throught this object
		//setDefaultSearchSpec("evl_activity is not null");
	}

Version=5.0.62

Merci pour votre aide / pistes de debugs.

Ophélie

Il manque des infos pour pouvoir comprendre votre pb.

  • De quel objet hérite cet objet :
    • au niveau paramétrage ?
    • au niveau Java ?
  • Quel est le code complet de cet objet (dans l’erreur ça parle du preValidate, or vous n’indiquez qu’un postLoad qui ne fait rien car tout est en commentaire… ce n’est donc sans doute pas là le pb)

A priori je pense que le pb est une incohérence entre le paramétrage et Java. Le bon pattern pour configurer un objet “User” spécifique c’est de le faire hériter de SimpleUser (à la fois au niveau paramétrage et au niveau Java si vous souhaitez en surcharger le comportement)

Bonjour David,
merci pour votre réponse rapide.
En complément :

  • l’objet hérite de m_user (SimpleUser) au niveau du paramétrage, rien au niveau Java (cf Capture)

  • Code complet :

package com.simplicite.objects.HumanRessource;

import java.util.*;
import com.simplicite.util.*;
import com.simplicite.util.tools.*;

/**
 * Business object HrEmployee
 */
public class HrEmployee extends com.simplicite.objects.System.SimpleUser {
	private static final long serialVersionUID = 1L;

	@Override
	public void postLoad() {
		super.postLoad();
		// hide most of the SimpleUser fields, keeping only email & login
	//	getField("usr_first_name").setVisible(ObjectField.VIS_HIDDEN);
	//	getField("usr_last_name").setVisible(ObjectField.VIS_HIDDEN);
	//	getField("usr_image_id").setVisible(ObjectField.VIS_HIDDEN);
		//getField("usr_email").setVisible(ObjectField.VIS_HIDDEN);
	//	getField("usr_lang").setVisible(ObjectField.VIS_HIDDEN);
	//	getField("usr_cell_num").setVisible(ObjectField.VIS_HIDDEN);
	//	getField("usr_active").setVisible(ObjectField.VIS_HIDDEN);
	//	getField("usr_home_id").setVisible(ObjectField.VIS_HIDDEN);
//		getField("row_module_id").setVisible(ObjectField.VIS_HIDDEN);
		
		// hide all users that were not created throught this object
		//setDefaultSearchSpec("evl_activity is not null");
	}
	@Override
	public List<String> preValidate() {
		// set some mandatory SimpleUser fields
		setFieldValue("row_module_id", ModuleDB.getModuleId("ApplicationUsers"));
		//following does not work because usr_menu is not part of SimpleUser
		// we manage it in a postSave query to avoid adding a useless object attribute
		//setFieldValue("usr_menu", "1");
		setFieldValue("usr_active", Grant.USER_ACTIVE);
		
		return super.preValidate();
	}
	
	public List<String> HR_dafValidation(Map<String, String> data){
		// HashMap : objet <Clé--nom logique de mon attribut d'action, valeur>
		// pour récupérer le commentaire de la daf dans le pop-up
		if(getStatus().equals("DEMAND_SENT")){
			String dComment = data.get("dafComment");
			AppLog.info("dafValidation " + dComment, getGrant());
			setFieldValue("hrEmpDafComment", dComment);
			setFieldValue("hrEmpVisaDAF",getGrant().getLogin()+" - "+getGrant().getDBDate());
			save();
					
		} else {
		 //Mettre un code erreur lorsque qu'on est plus dans le bon statut
		 //AppLog.info("Vous ne pouvez plus executer cette action.", getGrant());
		}
		return null;
	}
	
	
	public List<String> HR_DRHValidation(Map<String, String> data){
		// HashMap : objet <Clé--nom logique de mon attribut d'action, valeur>
		// pour récupérer le commentaire de la daf dans le pop-up
		if(getStatus().equals("DEMAND_SENT")){
			String dComment = data.get("rhComment");
			AppLog.info("rhComment " + dComment, getGrant());
			setFieldValue("hrEmpRhComment", dComment);
			setFieldValue("hrEmpVisaRH",getGrant().getLogin()+" - "+getGrant().getDBDate());
			save();
					
		} else {
			//Mettre un code erreur lorsque qu'on est plus dans le bon statut
			//AppLog.info("Vous ne pouvez plus executer cette action.", getGrant());
		}
		
		if( getFieldValue("hrEmpVisaDAF")!=""){
			setStatus("PREHIRE_SIGNED");
			save();
		}
		return null;
	}
	
	public List<String> HR_ServiceManagerValidation(Map<String, String> data){
		// HashMap : objet <Clé--nom logique de mon attribut d'action, valeur>
		// pour récupérer le commentaire de la daf dans le pop-up
		if(getStatus().equals("DEMAND_SENT")){
			String dComment = data.get("rhManagerVisa");
			AppLog.info("rhManagerVisa " + dComment, getGrant());
			setFieldValue("hrEmpActivityManagerComment", dComment);
			setFieldValue("hrEmpVisaRespactivit",getGrant().getLogin()+" - "+getGrant().getDBDate());
			save();
					
		} else {
			//Mettre un code erreur lorsque qu'on est plus dans le bon statut
			//AppLog.info("Vous ne pouvez plus executer cette action.", getGrant());
		}
		return null;
	}
	
	
	
	public List<String> hr_PresidentValidation (Map<String, String> data){
		// HashMap : objet <Clé--nom logique de mon attribut d'action, valeur>
		// pour récupérer le commentaire de la daf dans le pop-up
		String dComment = data.get("hrPresidentVisa");
		AppLog.info("hrPresidentVisa " + dComment, getGrant());
		setFieldValue("hrEmpPresidentComment", dComment);
		setFieldValue("hrPresidentVisa",getGrant().getLogin()+" - "+getGrant().getDBDate());
		save();
		return null;
	}

}

Pour info je viens de rajouter le hook preValidate() en accord avec un code édité sur un autre objet hérité de User.

J’ai ajouté sur le paramétrage au niveau de code hérité : “Simple User”. Cela a réglé le problème.

merci

Oui l’héritage est avant tout au niveau logique = paramétrage.

Ensuite, si vous avez des besoins de customisation de l’objet fils, la classe Java du fils devra hériter de la classe Java du père (si celle ci-existe).

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.