Domanda

Sto avendo davvero il problema con i puntoni (2.2.3).Ecco le mie validazioni sul campo su Actionname-validation.xml

<field name="txtRequestDateFrom">
   <field-validator type="conversion">
      <param name="repopulateField">false</param>
      <message>${getText("E011", {"Date from"})}</message>
   </field-validator>
</field>
.

Non ho convalidato () Metodo nella mia classe di azione.E ho questo nella mia classe di azione:

private Date txtRequestDateFrom;
{getter, setters}
.

Quando entrerò lettere sul mio campo TXTrequescestDateDo ottengo 3 messaggi di convalida su

<s:fielderror fieldName="txtRequestDateFrom"/> 
.

Sembra questo

Invalid field value for field "txtRequestDateFrom".
Invalid field value for field "txtRequestDateFrom".
Date from has an invalid value
.

Ho il mio tema personalizzato e sono sicuro che non ci sono molte modifiche dal tema semplice.Il mio stack di intercettore è praticamente lo stesso valore di valore predefinito.

<interceptor-stack name="defaultStack">
        <interceptor-ref name="security"/>
            <interceptor-ref name="exception"/>
            <interceptor-ref name="alias"/>
            <interceptor-ref name="servletConfig"/>
            <interceptor-ref name="i18n"/>
            <interceptor-ref name="prepare"/>
            <interceptor-ref name="chain"/>
            <interceptor-ref name="debugging"/>
            <interceptor-ref name="scopedModelDriven"/>
            <interceptor-ref name="modelDriven"/>
            <interceptor-ref name="fileUploadStack" />
            <interceptor-ref name="fileUpload" >
            <param name="maximumSize">4000000</param>
        </interceptor-ref> 
            <interceptor-ref name="checkbox"/>
            <interceptor-ref name="multiselect"/>
            <interceptor-ref name="staticParams"/>
            <interceptor-ref name="actionMappingParams"/>                   
        <interceptor-ref name="params"/>
        <interceptor-ref name="conversionError" />
        <interceptor-ref name="validation">
            <param name="excludeMethods">execute, complete ...</param>
        </interceptor-ref>
        <interceptor-ref name="workflow"/>

    </interceptor-stack>
.

Ho scoperto che un errore di campo può essere rimosso rimuovendo la rimozione di conversioni di intercettazione da parte dello stack.Ma non penso che causerebbe questo problema.I montanti dovrebbero essere in grado di mostrare errori solo definiti dallo sviluppatore, giusto?

Per favore aiutami su questo

È stato utile?

Soluzione 2

Ho trovato che il mio DateTimeConverter personalizzato stava causando le eccezioni e il messaggio di errore extra.Perché ho trovato il codice qui sotto dal libro Struts2 per cambiare il formato normale della mia data.Quando getta un'eccezione, mostra l'eccezione sulla console e il messaggio di errore sull'errore del campo anziché passare l'eccezione al validatore.Penso che sia una sorta di bug perché questa classe estende StrutsTypeConverter e dovrebbe funzionare come normali convertitori.

public class StringToDateTimeConverter extends StrutsTypeConverter {

private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat("yyyy/MM/dd");

public Object convertFromString(Map context, String[] strings, Class toClass) {     
    if (strings == null || strings.length == 0 || strings[0].trim().length() == 0) {
        return null;
    }

    try {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(DATETIME_FORMAT.parse(strings[0]));
        calendar.set(Calendar.HOUR, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        return calendar.getTime();

    } catch (ParseException e) {
        throw new TypeConversionException(e);
    }
}

public String convertToString(Map context, Object date) {
    if (date != null && date instanceof Date) {
        return DATETIME_FORMAT.format(date);
    } else {
        return null;
    }
}
.

}

Comunque ho cambiato throw new TypeConversionException(e); in return null; e ha aggiunto il validatore REQUIRED su convalida XML.Ora mi mostra errori quando metto la data non valida sui miei campi della data.

PS: C'è qualche altro modo per cambiare formato Global Data Struts?Grazie

Altri suggerimenti

Ho affrontato un problema simile ieri e ha finalmente trovato una soluzione che mi piace condividere.Sto usando annotazioni nelle mie azioni per la convalida, quindi ho modificato la pila di intercettori predefiniti di intercettazione e metto il mio sensibleconversioneerrorrinterroreptor invece di strutssconversitorerorrorinterroreptor. Questo è totale identico ma non crea errori di convalida.Invece sono generati mediante convalida configurati in annotazioni nelle mie azioni.

Ecco il mio convertitore:

public class SensibleConversionErrorInterceptor extends StrutsConversionErrorInterceptor {

   private static final long serialVersionUID = 8186282792289268544L;

   @Override
   public String intercept(ActionInvocation invocation) throws Exception {

      ActionContext invocationContext = invocation.getInvocationContext();
      Map<String, Object> conversionErrors = invocationContext.getConversionErrors();
      ValueStack stack = invocationContext.getValueStack();

      HashMap<Object, Object> fakie = null;

      for (Map.Entry<String, Object> entry : conversionErrors.entrySet()) {
         String propertyName = entry.getKey();
         Object value = entry.getValue();

         if (shouldAddError(propertyName, value)) {
            // removed cause error messages are generated from annotations in actions
            // String message = XWorkConverter.getConversionErrorMessage(propertyName, stack);
            // Object action = invocation.getAction();
            // if (action instanceof ValidationAware) {
            //    ValidationAware va = (ValidationAware) action;
            //    va.addFieldError(propertyName, message);
            // }

            if (fakie == null) {
               fakie = new HashMap<Object, Object>();
            }

            fakie.put(propertyName, getOverrideExpr(invocation, value));
         }
      }

      if (fakie != null) {
         // if there were some errors, put the original (fake) values in place right before the result
         stack.getContext().put(ORIGINAL_PROPERTY_OVERRIDE, fakie);
         invocation.addPreResultListener(new PreResultListener() {
            public void beforeResult(ActionInvocation invocation, String resultCode) {
               Map<Object, Object> fakie = (Map<Object, Object>) invocation.getInvocationContext().get(ORIGINAL_PROPERTY_OVERRIDE);
               if (fakie != null) {
                  invocation.getStack().setExprOverrides(fakie);
               }
            }
        });
     }
     return invocation.invoke();
  }
.

}

e un esempio Azione:

@Conversion
public class ProductAction extends ActionSupport {

   private Product product;
   // getter, setter and so on...

   @Action(...)
   @Validations(
       requiredFields = {
           @RequiredFieldValidator(
               type = ValidatorType.FIELD,
               fieldName = "product.validFrom",
               message = "required.product.validFrom",
               shortCircuit = true
           )
       },
       conversionErrorFields = {
          @ConversionErrorFieldValidator(
              fieldName = "product.validFrom",
              key = "invalid.fieldvalue.product.validFrom'",
              shortCircuit = true
          ) 
       }
   )
   public String saveOrUpdate() {
      // do something here...
   }
} 
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top