Benzer bir sorunum vardı ama bu Hibernate'in çift yönlü ilişkileriyle ilgiliydi. Hangi görüşle uğraştığıma bağlı olarak ilişkinin bir tarafını göstermek ve diğer tarafını programlı olarak görmezden gelmek istedim. Eğer bunu yapamazsan, kötü StackOverflowException
e- postalarla sonuçlanırsın . Örneğin, bu nesnelere sahip olsaydım
public class A{
Long id;
String name;
List<B> children;
}
public class B{
Long id;
A parent;
}
parent
A'ya bakıyorsam B'deki alanı programlı olarak yok saymak, B'ye bakıyorsam A'daki children
alanı görmezden gelmek isterdim.
Bunu yapmak için mixins kullanmaya başladım, ama bu çok çabuk korkunç hale geliyor; sadece verileri biçimlendirmek için var olan birçok işe yaramaz sınıfınız var. Bunu daha temiz bir şekilde ele almak için kendi serileştiricimi yazdım: https://github.com/monitorjbl/json-view .
Hangi alanların yok sayılacağını programlı olarak belirlemenize olanak tanır:
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(JsonView.class, new JsonViewSerializer());
mapper.registerModule(module);
List<A> list = getListOfA();
String json = mapper.writeValueAsString(JsonView.with(list)
.onClass(B.class, match()
.exclude("parent")));
Ayrıca, joker eşleştiriciler aracılığıyla çok basitleştirilmiş görünümleri kolayca belirlemenize olanak tanır:
String json = mapper.writeValueAsString(JsonView.with(list)
.onClass(A.class, match()
.exclude("*")
.include("id", "name")));
Benim orijinal durumumda, bunun gibi basit görüşlere duyulan ihtiyaç, ebeveyn / çocuk hakkında en az şeyi göstermekti, ama aynı zamanda rol tabanlı güvenliğimiz için de faydalı oldu. Nesne hakkında daha az bilgi döndürmek için nesnelerin daha az ayrıcalıklı görünümleri gerekir.
Bunların hepsi serileştiriciden geliyor, ancak uygulamamda Spring MVC kullanıyordum. Bu durumları düzgün bir şekilde ele almasını sağlamak için, mevcut Spring denetleyici sınıflarına bırakabileceğiniz bir entegrasyon yazdım:
@Controller
public class JsonController {
private JsonResult json = JsonResult.instance();
@Autowired
private TestObjectService service;
@RequestMapping(method = RequestMethod.GET, value = "/bean")
@ResponseBody
public List<TestObject> getTestObject() {
List<TestObject> list = service.list();
return json.use(JsonView.with(list)
.onClass(TestObject.class, Match.match()
.exclude("int1")
.include("ignoredDirect")))
.returnValue();
}
}
Her ikisi de Maven Central'da mevcuttur. Umarım dışarıdaki birine yardımcı olur, bu, Jackson için özellikle çirkin bir problemdir ve davam için iyi bir çözümü yoktur.