Hier sind meine Gedanken über Ihre Möglichkeiten. Zuerst einmal
Also für jede andere Antwort sollte ich ObjectMapper anders konfigurieren?
Wenn Sie beide json Versionen an verschiedenen Orten verwenden möchten wie diese
public Response getObject() // returns {"cinter" : {"state" : 1,"checks" : 10}}
public Response getShortNamesObject() // returns {"cin" : {"st" : 1,"cs" : 10}}
als yep, müssen Sie mehrere ObjectMappers
verwenden.
Aber wenn Sie nur 1 Darstellung überall verwenden möchten, dann werden Sie wahrscheinlich in der Lage sein, Jackson einmal mit benutzerdefinierten Mixin für Ihre Klassen einzurichten. Auf jeden Fall ist hier, wie Sie beide Optionen können: Und können mit nur 1 json Version auf einfachen Fall aussehen benötigt
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;
}
}
Dieser Code wird Kurznamen produzieren für Sie Felder überall Pojo. und implementieren unterschiedliche Verhalten für unterschiedliche Anforderung müssen wir wie diese neue benutzerdefinierte Anmerkung hinzufügen:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MixIn {}
-Controller wird wie folgt aussehen:
@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();
}
}
Und unsere MixInJacksonJsonProvider
haben 2 weitere @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;
}
}
Hier ist Demo-Code für Sie zu spielen: https://github.com/varren/jersey2-jacksonsetup/tree/master/src/main/java/ru/varren
Wie sieht POJO aus? Weil es leicht mit @JsonProperty (name = "cit") und so weiter oben Feldnamen gelöst werden kann.Wenn du deinen Pojo nicht ändern kannst, dann musst du einen benutzerdefinierten Mixin oder Serializer auf deinem 'ObjectMapper' verwenden. – varren
@Meine POJO hat JAXB Annotationen (@XmlRootElement) ans ja kann ich nicht ändern. Also sollte ich für jede unterschiedliche Antwort 'ObjectMapper' anders konfigurieren? Irgendeine Idee über 'ContextResolver'? –
Sie können sie nicht ändern, aber können Sie Anmerkungen hinzufügen? Wenn Sie können, '@ JsonProperty' auf den Eigenschaften und' @ JsonRootName' auf der Klasse mit Ihrem Problem lösen –