Ecco le mie opinioni sulle opzioni. Prima di tutto
Quindi per ogni risposta diversa dovrei configurare ObjectMapper in modo diverso?
Se si desidera utilizzare entrambe le versioni JSON in luoghi diversi come questo
public Response getObject() // returns {"cinter" : {"state" : 1,"checks" : 10}}
public Response getShortNamesObject() // returns {"cin" : {"st" : 1,"cs" : 10}}
Than sì, è necessario utilizzare più ObjectMappers
.
Ma se si desidera utilizzare solo 1 rappresentazione ovunque, probabilmente sarà possibile impostare Jackson una volta con un mix personalizzato per le lezioni. In ogni caso ecco come si può fare entrambe le opzioni: E consente di guardare al caso semplice con la versione appena 1 JSON necessario
public class TestBean {
private String name;
private int id;
//getters and setters
}
public interface TestBeanMixin {
@JsonProperty("short_field_name")
String getName();
@JsonProperty("short_field_id")
int getId();
}
@Provider
@Priority(1)
public class MixInJacksonJsonProvider extends JacksonJaxbJsonProvider {
private static final ObjectMapper mapper = createMapper();
public MixInJacksonJsonProvider() {
setMapper(mapper);
}
private static ObjectMapper createMapper() {
final ObjectMapper result = new ObjectMapper();
result.addMixIn(TestBean.class, TestBeanMixin.class);
return result;
}
}
Questo codice produrrà nomi brevi per voi POJO campi in tutto il mondo. e di attuare un comportamento diverso per la richiesta differente dobbiamo aggiungere nuova annotazione personalizzato come questo:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MixIn {}
controller sarà simile a questa:
@Path("test")
public class MyResource {
@GET
@MixIn // <== Here is important part
@Produces(MediaType.APPLICATION_JSON)
public Response getShortName() {
return Response.ok(demoObj()).build();
}
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response postLongName() {
return Response.ok(demoObj()).build();
}
}
E la nostra MixInJacksonJsonProvider
avranno 2 più @Override
:
//.. same as before
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return super.isReadable(type, genericType, annotations, mediaType) && hasMixInAnnotation(annotations);
}
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return super.isWriteable(type, genericType, annotations, mediaType) && hasMixInAnnotation(annotations);
}
public static boolean hasMixInAnnotation(Annotation[] annotations){
for(Annotation annotation: annotations){
if (annotation instanceof MixIn){
return true;
}
}
return false;
}
}
Ecco il codice demo per giocare: https://github.com/varren/jersey2-jacksonsetup/tree/master/src/main/java/ru/varren
Che aspetto hai POJO? Perché può essere facilmente risolto con @JsonProperty (name = "cit") e così via sopra i nomi dei campi.Se non riesci a cambiare il tuo pojo, allora sì, devi usare Mixin personalizzato o serializzatore su 'ObjectMapper' – varren
@My POJO ha annotazioni JAXB (@XmlRootElement) e sì, non posso cambiarle. Quindi per ogni diversa risposta dovrei configurare 'ObjectMapper' in modo diverso? Qualche idea su 'ContextResolver'? –
Non puoi _cambiarli, ma puoi _add_ annotazioni? Se possibile, '@ JsonProperty' sulle proprietà e' @ JsonRootName' sulla classe con risolvere il tuo problema –