Skip to content

Commit

Permalink
Fix #608 (#610)
Browse files Browse the repository at this point in the history
Aggiunta feature al deserializzatore dei messaggi json per lanciare
eccezione quando si tenta di assegnare un numero intero ad una enum.
  • Loading branch information
pintorig committed Aug 10, 2023
1 parent d186e25 commit fc2703c
Show file tree
Hide file tree
Showing 11 changed files with 263 additions and 209 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ Examples:
| acl | [ { servizio: 'Pagamenti', autorizzazioni: 'R' } ] | 'autorizzazioni' |
| acl | [ { servizio: 'Pagamenti' } ] | 'autorizzazioni' |
| servizioIntegrazione.url | 'xxxx' | 'url' |
| servizioIntegrazione | { versioneApi: 11111, url: 'http://prova.it', auth: { username: 'usr', password: 'pwd' } } | 'versioneApi' |
| servizioIntegrazione | { versioneApi: 'xxxxxxx', url: 'http://prova.it', auth: { username: 'usr', password: 'pwd' } } | 'versioneApi' |
| servizioIntegrazione | { versioneApi: 'REST v3', url: 'http://prova.it', auth: { username: 'usr', password: 'pwd' } } | 'versioneApi' |
| servizioIntegrazione | { versioneApi: 'SOAP v4', url: 'http://prova.it', auth: { username: 'usr', password: 'pwd' } } | 'versioneApi' |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,4 +311,44 @@ Examples:
| allegati.descrizione | pendenzaPut.allegati[0].descrizione | loremIpsum | 'descrizione' |
| allegati.contenuto | pendenzaPut.allegati[0].contenuto | null | 'contenuto' |

@test-stato
Scenario Outline: <field> non valida

* def pendenzaPut = read('classpath:test/api/pendenza/v3/pendenze/put/msg/pendenza-put_monovoce_definito.json')
* set pendenzaPut.allegati[0].nome = 'tipoPendenza-promemoria-oggetto-freemarker.ftl'
* set pendenzaPut.allegati[0].tipo = 'application/json'
* set pendenzaPut.allegati[0].descrizione = 'test allegato'
* set pendenzaPut.allegati[0].contenuto = encodeBase64InputStream(read('classpath:test/api/backoffice/v1/pendenze/put/msg/tipoPendenza-promemoria-oggetto-freemarker.ftl'))

* def numeroAvviso = buildNumeroAvviso(dominio, applicazione)
* def iuv = getIuvFromNumeroAvviso(numeroAvviso)
* call read('classpath:utils/pa-prepara-avviso.feature')
* def ccp = getCurrentTimeMillis()
* def importo = 100.99

* set pendenzaPut.idA2A = idA2A
* set pendenzaPut.idPendenza = idPendenza
* set pendenzaPut.numeroAvviso = numeroAvviso
* remove pendenzaPut.stato

* set pendenzaVerificataV2.pendenza = pendenzaPut
* set pendenzaVerificataV2.stato = <fieldValue>

Given url ente_api_url
And path '/v2/avvisi', idDominio, numeroAvviso
And request pendenzaVerificataV2
When method post
Then status 200

* def tipoRicevuta = "R01"
* call read('classpath:utils/psp-attiva-rpt.feature')
* match response contains { dati: '##null'}
* match response.faultBean == esitoAttivaRPT
* match response.faultBean.description contains <fieldResponse>

Examples:
| field | fieldValue | fieldResponse |
| stato | null | 'Stato' |
| stato | loremIpsum | 'stato' |
| stato | 1 | 'stato' |
| stato | 'XXX' | 'stato' |
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package it.govpay.rs.v3.serialization;

import org.openspcoop2.utils.serialization.IDeserializer;
import org.openspcoop2.utils.serialization.SerializationConfig;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.deser.BeanDeserializerFactory;
import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
import com.fasterxml.jackson.databind.deser.DefaultDeserializationContext;
import com.fasterxml.jackson.databind.deser.DeserializerFactory;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;

import it.govpay.core.exceptions.ValidationException;
import it.govpay.core.utils.SimpleDateFormatUtils;
import it.govpay.core.utils.rawutils.DateModule;
import it.govpay.core.utils.serialization.BeanDeserializerModifierForIgnorables;

public class JsonJacksonDeserializer {

private JsonJacksonDeserializer () {}

public static <T> T parse(String jsonString, Class<T> t) throws ValidationException {
SerializationConfig serializationConfig = new SerializationConfig();
serializationConfig.setDf(SimpleDateFormatUtils.newSimpleDateFormatSoloData());
serializationConfig.setIgnoreNullValues(true);
return parse(jsonString, t, serializationConfig);
}

public static <T> T parse(String jsonString, Class<T> t, SerializationConfig serializationConfig) throws ValidationException {
try {
BeanDeserializerModifier modifier = new BeanDeserializerModifierForIgnorables(serializationConfig.getExcludes());
DeserializerFactory dFactory = BeanDeserializerFactory.instance.withDeserializerModifier(modifier);

ObjectMapper mapper = new ObjectMapper(null, null, new DefaultDeserializationContext.Impl(dFactory));
mapper.setDateFormat(serializationConfig.getDf());
if(serializationConfig.isSerializeEnumAsString())
mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);

mapper = new ObjectMapper();
mapper.registerModule(new JaxbAnnotationModule());
mapper.registerModule(new DateModule());
mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.setDateFormat(SimpleDateFormatUtils.newSimpleDateFormatSoloData());
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
mapper.configure(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS,true);

IDeserializer deserializer = new it.govpay.core.utils.serialization.JsonJacksonDeserializer(mapper);

@SuppressWarnings("unchecked")
T object = (T) deserializer.getObject(jsonString, t);
return object;
} catch(org.openspcoop2.utils.serialization.IOException e) {
throw new ValidationException(e.getMessage(), e);
}
}
}
5 changes: 5 additions & 0 deletions jars/core-beans/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>

<dependency>
<groupId>org.apache.httpcomponents</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
package it.govpay.core.beans;

import java.io.InputStream;
import java.util.Arrays;

import org.openspcoop2.utils.serialization.IDeserializer;
import org.openspcoop2.utils.serialization.ISerializer;
import org.openspcoop2.utils.serialization.JsonJacksonSerializer;
import org.openspcoop2.utils.serialization.SerializationConfig;
import org.openspcoop2.utils.serialization.SerializationFactory;
import org.openspcoop2.utils.serialization.SerializationFactory.SERIALIZATION_TYPE;

import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.annotation.JsonIgnore;

import it.govpay.core.exceptions.IOException;
import it.govpay.core.utils.SimpleDateFormatUtils;
import it.govpay.core.utils.serialization.JsonJacksonDeserializer;


@JsonFilter(value="risultati")
Expand All @@ -35,23 +34,24 @@ public String toJSON(String fields, SerializationConfig serializationConfig) thr
serializationConfig.setIncludes(Arrays.asList(fields.split(",")));
serializationConfig.setExcludes(null);
}
ISerializer serializer = SerializationFactory.getSerializer(SERIALIZATION_TYPE.JSON_JACKSON, serializationConfig);
ISerializer serializer = new JsonJacksonSerializer(serializationConfig);
return serializer.getObject(this);
} catch(org.openspcoop2.utils.serialization.IOException e) {
throw new IOException("Errore nella serializzazione della risposta.", e);
}
}

public static <T> T parse(String jsonString, Class<T> t) throws IOException {
SerializationConfig serializationConfig = new SerializationConfig();
it.govpay.core.utils.serialization.SerializationConfig serializationConfig = new it.govpay.core.utils.serialization.SerializationConfig();
serializationConfig.setDf(SimpleDateFormatUtils.newSimpleDateFormatSoloData());
serializationConfig.setIgnoreNullValues(true);
serializationConfig.setFailOnNumbersForEnums(true);
return parse(jsonString, t, serializationConfig);
}

public static <T> T parse(String jsonString, Class<T> t, SerializationConfig serializationConfig) throws IOException {
public static <T> T parse(String jsonString, Class<T> t, it.govpay.core.utils.serialization.SerializationConfig serializationConfig) throws IOException {
try {
IDeserializer deserializer = SerializationFactory.getDeserializer(SERIALIZATION_TYPE.JSON_JACKSON, serializationConfig);
IDeserializer deserializer = new JsonJacksonDeserializer(serializationConfig);

@SuppressWarnings("unchecked")
T object = (T) deserializer.getObject(jsonString, t);
Expand All @@ -60,24 +60,4 @@ public static <T> T parse(String jsonString, Class<T> t, SerializationConfig ser
throw new IOException(e.getMessage(), e);
}
}


public static <T> T read(InputStream jsonIS, Class<T> t) throws IOException {
SerializationConfig serializationConfig = new SerializationConfig();
serializationConfig.setDf(SimpleDateFormatUtils.newSimpleDateFormatSoloData());
serializationConfig.setIgnoreNullValues(true);
return read(jsonIS, t, serializationConfig);
}

public static <T> T read(InputStream jsonIS, Class<T> t, SerializationConfig serializationConfig) throws IOException {
try {
IDeserializer deserializer = SerializationFactory.getDeserializer(SERIALIZATION_TYPE.JSON_JACKSON, serializationConfig);

@SuppressWarnings("unchecked")
T object = (T) deserializer.readObject(jsonIS, t);
return object;
} catch(org.openspcoop2.utils.serialization.IOException e) {
throw new IOException(e.getMessage(), e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package it.govpay.core.utils.serialization;

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.deser.BeanDeserializerBuilder;
import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;

public class BeanDeserializerModifierForIgnorables extends BeanDeserializerModifier {

private List<String> ignorables;

public BeanDeserializerModifierForIgnorables(List<String> properties) {
if(properties!=null)
this.ignorables = properties;
else
this.ignorables = new ArrayList<>();
}

@Override
public BeanDeserializerBuilder updateBuilder(
DeserializationConfig config, BeanDescription beanDesc,
BeanDeserializerBuilder builder) {

for(String ignorable : this.ignorables) {
builder.addIgnorable(ignorable);
}

return builder;
}

@Override
public List<BeanPropertyDefinition> updateProperties(
DeserializationConfig config, BeanDescription beanDesc,
List<BeanPropertyDefinition> propDefs) {

List<BeanPropertyDefinition> newPropDefs = new ArrayList<>();
for(BeanPropertyDefinition propDef : propDefs) {
if(!this.ignorables.contains(propDef.getName())) {
newPropDefs.add(propDef);
}
}
return newPropDefs;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package it.govpay.core.utils.serialization;


import java.io.InputStream;
import java.io.Reader;

import org.openspcoop2.utils.serialization.IDeserializer;
import org.openspcoop2.utils.serialization.IOException;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.BeanDeserializerFactory;
import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
import com.fasterxml.jackson.databind.deser.DefaultDeserializationContext;
import com.fasterxml.jackson.databind.deser.DeserializerFactory;

/**
* Contiene utility per effettuare la de-serializzazione di un oggetto
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/

public class JsonJacksonDeserializer implements IDeserializer{

private ObjectMapper mapper;

public JsonJacksonDeserializer() {
this(new SerializationConfig());
}

public JsonJacksonDeserializer(SerializationConfig config) {
BeanDeserializerModifier modifier = new BeanDeserializerModifierForIgnorables(config.getExcludes());
DeserializerFactory dFactory = BeanDeserializerFactory.instance.withDeserializerModifier(modifier);

this.mapper = new ObjectMapper(null, null, new DefaultDeserializationContext.Impl(dFactory));
this.mapper.setDateFormat(config.getDf());
if(config.isSerializeEnumAsString())
this.mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
if(config.isFailOnNumbersForEnums())
this.mapper.enable(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS);

}

public JsonJacksonDeserializer(ObjectMapper mapper) {
this.mapper = mapper;
}

@Override
public Object getObject(String s, Class<?> classType) throws IOException{
try {
return this.mapper.readValue(s, classType);
} catch (java.io.IOException e) {
throw new IOException(e);
}
}

@Override
public Object readObject(InputStream is, Class<?> classType) throws IOException {
try {
return this.mapper.readValue(is, classType);
} catch (java.io.IOException e) {
throw new IOException(e);
}
}

@Override
public Object readObject(Reader reader, Class<?> classType) throws IOException {
try {
return this.mapper.readValue(reader, classType);
} catch (java.io.IOException e) {
throw new IOException(e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package it.govpay.core.utils.serialization;

/**
* @author Bussu Giovanni (bussu@link.it)
* @author Pintori Giuliano (pintori@link.it)
* @author $Author$
* @version $Rev$, $Date$
*
*/
public class SerializationConfig extends org.openspcoop2.utils.serialization.SerializationConfig{

private boolean failOnNumbersForEnums = false; // default

public boolean isFailOnNumbersForEnums() {
return failOnNumbersForEnums;
}
public void setFailOnNumbersForEnums(boolean failOnNumbersForEnums) {
this.failOnNumbersForEnums = failOnNumbersForEnums;
}
}

0 comments on commit fc2703c

Please sign in to comment.