The following happens to me:
I need to create a validator to capture the DNI entered in the form, connect to an external server by returning a json if said DNI exists and, depending on the means of transport chosen and the letter that appears in the json, determine if has or does not have the necessary permission. The problem concretely arises when arriving at the reader in the method since it is empty and I do not know how to pass the data because I also need the user Bean. I leave the code:
Methods for validation
public DgtBean ValidaDgt (Object value) {
return target.register(DgtReader.class)
.path("{dni}").resolveTemplate("dni",view.getDni())
.request(MediaType.APPLICATION_JSON)
.get(DgtBean.class);
}
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
String dgt=ValidaDgt(value).getTipopermiso();
String medio=view.getMedio();
if(dgt.equals("A") && medio.equals("coche") ||( ValidaDgt(value).getTipopermiso().equals("B") && medio.equals("moto"))){
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error de validación", "El usuario no tiene el permiso necesario."));
}
}
Target corresponds to the server url
DgtBean
package client;
/ ** * * @author Admin * / public class DgtBean { String dni; String typepermiso;
public String getDni() {
return dni;
}
public void setDni(String dni) {
this.dni = dni;
}
public String getTipopermiso() {
return tipopermiso;
}
public void setTipopermiso(String tipopermiso) {
this.tipopermiso = tipopermiso;
}
}
Dgt Reader
package json;
import client.DgtBean; import java.io.IOException; import java.io.InputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import javax.json.Json; import javax.json.stream.JsonParser; import javax.ws.rs.Consumes; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.MessageBodyReader; import javax.ws.rs.ext.Provider;
@Provider @Consumes (MediaType.APPLICATION_JSON) public class DgtReader implements MessageBodyReader {
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return DgtBean.class.isAssignableFrom(type);
}
@Override
public DgtBean readFrom(Class<DgtBean> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException {
DgtBean dgt = new DgtBean();
JsonParser parser = Json.createParser(entityStream);
while (parser.hasNext()) {
switch (parser.next()) {
case KEY_NAME:
String key = parser.getString();
parser.next();
switch (key) {
case "dni":
dgt.setDni(parser.getString());
break;
case "tipopermiso":
dgt.setTipopermiso(parser.getString());
break;
default:
break;
}
break;
default:
break;
}
}
return dgt;
}
}
Dgt Writer
package json;
import client.DgtBean; import java.io.IOException; import java.io.OutputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import javax.json.Json; import javax.json.stream.JsonGenerator; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.MessageBodyWriter; import javax.ws.rs.ext.Provider; import com.mycompany.pfinal2psegrupo2.entidades.Usuarios; @Provider @Produces (MediaType.APPLICATION_JSON) public class DgtWriter implements MessageBodyWriter {
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return Usuarios.class.isAssignableFrom(type);
}
@Override
public long getSize(DgtBean t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return -1;
}
@Override
public void writeTo(DgtBean t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
JsonGenerator gen = Json.createGenerator(entityStream);
gen.writeStartObject()
.write("dni", t.getDni())
.write("tipopermiso", t.getTipopermiso())
.writeEnd();
gen.flush();
}
}
Registration form
<body>
<ui:composition template="./WEB-INF/template.xhtml">
<ui:define name="content">
<h:form>
<f:event listener="#{registerView.validarPassword}" type="postValidate" />
<p:panel header="Crear una nueva cuenta">
<h:panelGrid id="grid" columns="3">
<h:outputLabel for="nombre" value="Nombre:" style="font-weight:bold"/>
<p:inputText id="nombre" value="#{registerView.nombre}" required="true"
requiredMessage="Introduzca su nombre.">
<f:validateLength maximum="30"/>
</p:inputText>
<p:message for="nombre"/>
<h:outputLabel for="apellidos" value="Apellidos:" style="font-weight:bold"/>
<p:inputText id="apellidos" value="#{registerView.apellidos}" required="true"
requiredMessage="Introduzca sus apellidos.">
<f:validateLength maximum="50"/>
</p:inputText>
<p:message for="apellidos"/>
<h:outputLabel for="email" value="E-Mail:" style="font-weight:bold"/>
<p:inputText id="email" value="#{registerView.email}" required="true"
requiredMessage="Introduzca su email.">
<f:validator validatorId="emailValidator" />
</p:inputText>
<p:message for="email"/>
<h:outputLabel for="fechanac" value="Fecha de nacimiento:" style="font-weight:bold"/>
<p:inputText type="Date" id="fechanac" value="#{registerView.fechanac}" required="true"
requiredMessage="Introduzca su fecha de nacimiento.">
<f:validator validatorId="ageValidator"/>
<f:validateLength maximum="10"/>
</p:inputText>
<p:message for="fechanac"/>
<h:outputLabel for="dni" value="DNI:" style="font-weight:bold"/>
<p:inputText id="dni" value="#{registerView.dni}" required="true"
requiredMessage="Introduzca su DNI.">
<f:validateLength minimum="9" maximum="9"/>
</p:inputText>
<p:message for="dni"/>
<h:outputLabel for="movil" value="Móvil:" style="font-weight:bold"/>
<p:inputText id="movil" value="#{registerView.movil}" required="true" onkeypress="if (event.which < 48 || event.which > 57) return false;">
<f:convertNumber integerOnly="true"/>
<f:validateLength minimum="9" maximum="9"/>
</p:inputText>
<p:message for="movil"/>
<h:outputLabel for="localidad" value="Localidad:" style="font-weight:bold"/>
<p:inputText id="localidad" value="#{registerView.localidad}" required="true">
<f:validateLength maximum="100"/>
</p:inputText>
<p:message for="localidad"/>
<h:outputLabel for="password" value="Contraseña:" style="font-weight:bold"/>
<p:password id="password" value="#{registerView.password}" feedback="true"
required="true" requiredMessage="Introduzca su contraseña."
validatorMessage="La contraseña debe contener al menos un número,
así como caracteres tanto en mayúscula como en minúscula, además de
contar con una longitud comprendida entre 6 y 20 caracteres alfanuméricos">
<f:validateRegex pattern="((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20})" />
</p:password>
<p:message for="password"/>
<h:outputLabel for="confirmpassword" value="Confirmar contraseña:" style="font-weight:bold"/>
<p:password id="confirmpassword" feedback="true"
value="#{registerView.confirmPassword}" required="true"
requiredMessage="Por favor, confirma tu contraseña."/>
<p:message for="confirmpassword"/>
<h:outputLabel for="medio" value="Medio:" style="font-weight:bold"/>
<h:selectOneMenu id="medio" value="#{registerView.medio}" required="true" requiredMessage="Introduzca el transporte.">
<f:selectItem itemLabel="Coche" itemValue="coche"/>
<f:selectItem itemLabel="Moto" itemValue="moto"/>
**Aquí se invocaría la validación pero me salta nullpointer por lo que he mencionado**
</h:selectOneMenu>
</h:panelGrid>
<p:commandButton value="Registrarse" ajax="false" action="#{registerView.register}"/>
<p:growl id="message" showDetail="true" />
<p:commandButton value="Ayuda" actionListener="#{dialogView.confirmDel}" update="message">
<p:confirm header="Ayuda" message="Longitudes máximas permitidas: Nombre=30;Apellidos=50 ; Fecha de nacimiento=10; Localidad=100; Móvil=9; DNI=9; Email=255; Password=mínimo 6 y máximo 20 caracteres alfanuméricos incluyendo cifras, mayúsculas y minúsculas" icon="ui-icon-alert" />
</p:commandButton>
<p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
</p:confirmDialog>
</p:panel>
</h:form>
</ui:define>
</ui:composition>
</body>
Thanks in advance