[JAVA] Als ich in Spring Boot eine Sitzungsbereichs-Bean definierte, verhielt sie sich seltsam und musste angepasst werden.

Einführung

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.

Ursache eines Problems

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.

Korrespondenzpolitik

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

Als ich in Spring Boot eine Sitzungsbereichs-Bean definierte, verhielt sie sich seltsam und musste angepasst werden.
Wenn ich die Internationalisierung mit Spring Boot unterstütze, bin ich süchtig danach, kein bestimmtes Gebietsschema zu übersetzen
Bis Sie ein Spring Boot-Projekt in Intellij erstellen und an Github senden
So fügen Sie in Spring Boot einen Klassenpfad hinzu
Ich möchte eine Verbindung herstellen, wenn eine Datenbank mit Spring und MyBatis erstellt wird
Wovon ich süchtig war, als ich eine Spring Boot-Anwendung mit VS Code entwickelte
Beachten Sie, dass ich süchtig nach Stapelverarbeitung mit Spring Boot war
Eine Seite, die leicht zu verstehen war, als ich anfing, Spring Boot zu lernen
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
Ich habe im Frühjahr einen Restful-Server und -Client erstellt.
Rufen Sie eine Liste anderer Sitzungen desselben Benutzers ab, wenn Sie Redis Session mit Spring Boot (Serie 2) verwenden. Entsorgen Sie es auch.
Session war ein Cookie, das beim Schließen des Browsers gelöscht werden sollte, und eine Methode zum Austauschen: Rails Tutorial Hinweis - Was ist eine Rails-Sitzung?
Was ich beim Update auf Spring Boot 1.5.12 behoben habe ・ Wovon ich süchtig war
Aufrufen und Verwenden der API in Java (Spring Boot)
Erstellen Sie eine Spring Boot-Webanwendung, die IBM Cloudant verwendet, und stellen Sie sie in Cloud Foundry bereit
Spring Boot 2.2 unterstützt jetzt RSocket. Probieren Sie es aus
Wird in Spring Boot mithilfe einer Bean-Definitionsdatei mit dem Namen application.xml angepasst
Was ich bei der Migration von der Spring Boot 1.4-Serie zur 2.0-Serie getan habe
Ich habe ein Routensuchprogramm in TDD geschrieben und versucht, es umzugestalten
Was ich bei der Migration von der Spring Boot 1.5-Serie zur 2.0-Serie getan habe
Anzeigen der in Spring Boot eingegebenen Zeichen im Browser und Referenzlinks [Einführung in Spring Boot / Für Anfänger]