Skip to content

Instantly share code, notes, and snippets.

@sgrimm
Created May 12, 2022 07:49
Show Gist options
  • Save sgrimm/b2a548eafc253588370b3e130a85f497 to your computer and use it in GitHub Desktop.
Save sgrimm/b2a548eafc253588370b3e130a85f497 to your computer and use it in GitHub Desktop.
Quick-and-dirty proof of concept for overriding JobRunr JSON mapper visibility settings
package com.example
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.introspect.AnnotatedField
import com.fasterxml.jackson.databind.introspect.AnnotatedMember
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod
import com.fasterxml.jackson.databind.introspect.VisibilityChecker
import java.lang.reflect.Field
import java.lang.reflect.Member
import java.lang.reflect.Method
import java.lang.reflect.Modifier
import javax.annotation.ManagedBean
import org.jobrunr.utils.mapper.jackson.JacksonJsonMapper
@ManagedBean
class JobRunrJsonMapper : JacksonJsonMapper() {
override fun initObjectMapper(
objectMapper: ObjectMapper,
moduleAutoDiscover: Boolean
): ObjectMapper {
val mapper = super.initObjectMapper(objectMapper, moduleAutoDiscover)
val checker = CustomVisibilityChecker(mapper.visibilityChecker)
return mapper.setVisibility(checker)
}
class CustomVisibilityChecker<T : VisibilityChecker<T>>(
private val defaultChecker: VisibilityChecker<T>
) : VisibilityChecker<T> by defaultChecker {
private fun isCustom(clazz: Class<*>) = clazz.packageName.startsWith("com.example")
override fun isFieldVisible(f: Field): Boolean =
!isCustom(f.declaringClass) && defaultChecker.isFieldVisible(f)
override fun isFieldVisible(f: AnnotatedField): Boolean = isFieldVisible(f.annotated)
override fun isGetterVisible(m: Method): Boolean {
return if (isCustom(m.declaringClass)) Modifier.isPublic(m.modifiers)
else defaultChecker.isGetterVisible(m)
}
override fun isGetterVisible(m: AnnotatedMethod): Boolean = isGetterVisible(m.annotated)
override fun isIsGetterVisible(m: Method): Boolean = isGetterVisible(m)
override fun isIsGetterVisible(m: AnnotatedMethod): Boolean = isGetterVisible(m)
override fun isCreatorVisible(m: Member): Boolean {
return if (isCustom(m.declaringClass)) Modifier.isPublic(m.modifiers)
else defaultChecker.isCreatorVisible(m)
}
override fun isCreatorVisible(m: AnnotatedMember): Boolean = isCreatorVisible(m.member)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment