Как реализовать пользовательскую сериализацию Джексона вне доменного компонента?
У меня есть боб Spring, управляемый...
@Component("Foobean")
@Scope("prototype")
public class foobean {
private String bar1;
private String bar2;
public String getBar1() {
return bar1;
}
public void setBar1(String bar1) {
this.bar1 = bar1;
}
public String getBar2() {
return bar2;
}
public void setBar2(String bar2) {
this.bar2 = bar2;
}
}
... и поскольку я использую Dojo Dgrid для отображения ArrayList этого компонента, я возвращаю его в контроллер в виде строки JSON:
@Controller
@RequestMapping("/bo")
public class FooController {
@Autowired
private FooService fooService
@RequestMapping("action=getListOfFoos*")
@ResponseBody
public String clickDisplayFoos(
Map<String, Object> model) {
List<Foobean> foobeans = fooService.getFoobeans();
ObjectMapper objMapper = new ObjectMapper();
String FooJson = null;
try {
FooJson = objMapper.writeValueAsString(foobeans);
} catch (JsonGenerationException e) {
etc.
}
Однако моя сетка нуждается в дополнительном столбце, который будет содержать действительное действие для каждого Foo; это действие на самом деле не зависит от каких-либо данных в отдельных Foos - у них всех будет одинаковое действительное действие - повторяется в каждой строке результирующего DGrid - но это значение на самом деле зависит от ролей безопасности в сеансе...который не может быть отправлен на передний конец в Json. Итак, мое решение двоякое:
Сначала мне нужно добавить "виртуальное" свойство Json в bean-компонент... что я могу сделать в bean-компоненте с помощью метода @JsonProperty для метода...
@JsonProperty("validActions") public String writeValidActions { return "placeHolderForSerializerToChange"; }
... но он просто генерирует заполнитель. Чтобы действительно сгенерировать допустимое значение, мне нужно сослаться на роль безопасности сеанса, которую я очень неохотно кодирую в приведенном выше методе. (Вызов службы в самом доменном компоненте? Кажется очень неправильным.) Я думаю, что мне следует создать собственный сериализатор и поместить логику - и ссылку на роль Session.Security. Правильны ли мои инстинкты, чтобы не вводить информацию о сеансе в метод доменного компонента? И если да, то что бы такого
кастомный сериализатор похож?
1 ответ
Да, я не буду помещать информацию о сеансе в домен или сеанс доступа непосредственно в моем домене.
Если нет конкретной причины, вы можете просто добавить логику в свой класс действий.
public String clickDisplayFoos(){
List<Foo> foos = service.getFoos();
for(iterate through foos){
foo.setValidAction(session.hasSecurityRole())
}
String json = objMapper.writeValueAsString(foobeans);
return json;
}
Мне не нравится идея установки новых значений как часть процесса сериализации. Я чувствую, что пользовательские сериализаторы предназначены для преобразования представления определенного свойства, а не для добавления новых значений в свойство.