Как реализовать пользовательскую сериализацию Джексона вне доменного компонента?

У меня есть боб 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. Итак, мое решение двоякое:

  1. Сначала мне нужно добавить "виртуальное" свойство Json в bean-компонент... что я могу сделать в bean-компоненте с помощью метода @JsonProperty для метода...

    @JsonProperty("validActions")
    public String writeValidActions {
         return "placeHolderForSerializerToChange";
    }
    
  2. ... но он просто генерирует заполнитель. Чтобы действительно сгенерировать допустимое значение, мне нужно сослаться на роль безопасности сеанса, которую я очень неохотно кодирую в приведенном выше методе. (Вызов службы в самом доменном компоненте? Кажется очень неправильным.) Я думаю, что мне следует создать собственный сериализатор и поместить логику - и ссылку на роль 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;
}

Мне не нравится идея установки новых значений как часть процесса сериализации. Я чувствую, что пользовательские сериализаторы предназначены для преобразования представления определенного свойства, а не для добавления новых значений в свойство.

Другие вопросы по тегам