Une histoire lors de la construction d'une application avec la configuration de Spring Boot (Freemarker + Doma2).
C'est mal de l'implémenter avec une compréhension vague, mais quand j'ai défini un bean à portée de session, je ne pouvais pas accéder à des propriétés comme hoge.fuga
sur ftl.
J'aurais dû y accéder via Getter comme hoge.getFuga ()
, mais j'ai pensé que je devrais enquêter sur la cause et rendre possible l'accès à la propriété, et je pourrais le faire.
Au fait, lorsque je l'ai renvoyé en JSON, il avait des propriétés étranges, alors j'ai essayé de ne pas l'utiliser.
Les beans de session ont été enveloppés dans un proxy créé avec cglib
.
Peut-être que ce proxy a une variable ThreadLocal
, qui est un proxy d'objet différent pour chaque requête.
Vous pouvez écrire une configuration qui supprime le proxy et gère les objets bruts en sortie.
Heureusement, le proxy semble avoir une interface appelée ScopedObject
, que je pourrais supprimer avec ScopedObject # getTargetObject
.
Cliquez ici pour obtenir de l'aide sur Freemarker
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);
}
}
}
Cliquez ici pour l'assistance Jackson
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);
}
}
}