Eine Geschichte beim Erstellen einer Anwendung mit der Konfiguration von Spring Boot (Freemarker + Doma2). Es ist schlecht, es mit einem losen Verständnis zu implementieren, aber als ich eine Bean mit Sitzungsbereich definierte, konnte ich auf ftl nicht auf Eigenschaften wie "hoge.fuga" zugreifen. Ich hätte über Getter wie "hoge.getFuga ()" darauf zugreifen sollen, aber ich dachte, ich sollte die Ursache untersuchen und den Zugriff auf die Eigenschaft ermöglichen, und ich könnte es tun. Übrigens, als ich es als JSON zurückgab, hatte es seltsame Eigenschaften, also habe ich versucht, es nicht zu verwenden.
Bohnen mit Sitzungsbereich wurden in einen mit "cglib" erstellten Proxy eingewickelt. Möglicherweise hat dieser Proxy eine "ThreadLocal" -Variable, die für jede Anforderung ein anderer Objekt-Proxy ist.
Sie können eine Konfiguration schreiben, die den Proxy entfernt und Rohobjekte bei der Ausgabe verarbeitet. Glücklicherweise scheint der Proxy eine Schnittstelle namens "ScopedObject" zu haben, die ich mit "ScopedObject # getTargetObject" entfernen könnte.
Klicken Sie hier, um Unterstützung für Freemarker zu erhalten
FreemarkerConfig.java
@Configuration
public class FreemarkerConfig {
@Autowired
void configureFreemarkerConfigurer(FreeMarkerConfig config) {
freemarker.template.Configuration templateConfig = config.getConfiguration();
templateConfig.setObjectWrapper(new CustomWrapper());
}
private static class CustomWrapper extends DefaultObjectWrapper {
CustomWrapper() {
super(freemarker.template.Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
}
@Override
protected TemplateModel handleUnknownType(Object obj) throws TemplateModelException {
if (obj instanceof ScopedObject) {
return super.handleUnknownType(((ScopedObject) obj).getTargetObject());
}
return super.handleUnknownType(obj);
}
}
}
Klicken Sie hier, um Unterstützung von Jackson zu erhalten
JacksonConfig.java
@Configuration
public class JacksonConfig {
@Autowired
public void configureObjectMapperConfig(ObjectMapper objectMapper) {
objectMapper.registerModule(new ScopedObjectModule());
}
private static class ScopedObjectModule extends Module {
@Getter
private final String moduleName = "scopedObjectModule";
@Override
public Version version() {
return PackageVersion.VERSION;
}
@Override
public void setupModule(SetupContext context) {
context.addSerializers(new Serializers.Base() {
@Override
public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType type, BeanDescription beanDesc) {
Class<?> raw = type.getRawClass();
if (ScopedObject.class.isAssignableFrom(raw)) {
return new ScopedObjectSerializer(type.getSuperClass());
}
return super.findSerializer(config, type, beanDesc);
}
});
}
}
@AllArgsConstructor
private static class ScopedObjectSerializer extends JsonSerializer<ScopedObject> {
private JavaType type;
@Override
public void serialize(ScopedObject value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
serializers.findValueSerializer(type).serialize(value.getTargetObject(), gen, serializers);
}
}
}
Recommended Posts