0

私はSpringマネージドBeanを持っています...

@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 を使用してこの Bean の 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 ごとに有効なアクションを含む追加の列が必要です。そのアクションは、個々のFooのデータに実際には依存していません-それらはすべて同じ有効なアクションを持ちます-結果のDGridの各行で繰り返されます-しかし、その値は実際にはセッションのセキュリティロールに依存しています... Json でフロントエンドに送信することはできません。したがって、私の解決策は2つあります。

  1. 最初に、「仮想」Json プロパティを Bean に追加する必要があります。これは、メソッドで @JsonProperty を使用して Bean で実行できます...

    @JsonProperty("validActions")
    public String writeValidActions {
         return "placeHolderForSerializerToChange";
    }
    
  2. ...しかし、プレースホルダーを生成するだけです。有効な値を実際に生成するには、セッションのセキュリティ ロールを参照する必要がありますが、上記の方法でコーディングするのは非常に気が進まないのです。(ドメイン Bean 自体でのサービス呼び出し? 非常に間違っているようです。) カスタム シリアライザーを作成し、ロジックを配置する必要があると思います。また、Session.Security ロールへの参照をそこに配置します。セッション情報をドメイン Bean メソッドに注入しないという私の本能は正しいのでしょうか? もしそうなら、そのよう
    なカスタムシリアライザーはどのように見えるでしょうか?

4

1 に答える 1

1

はい、セッション情報をドメインに入れたり、ドメイン内のセッションに直接アクセスしたりしません。

特別な理由がない限り、アクション クラスにロジックを追加するだけで済みます。

public String clickDisplayFoos(){
    List<Foo> foos =  service.getFoos();
    for(iterate through foos){
        foo.setValidAction(session.hasSecurityRole())
    }
    String json = objMapper.writeValueAsString(foobeans);
    return json;
}

シリアル化プロセスの一部として新しい値を設定するという考えは好きではありません。カスタムシリアライザーは、プロパティに新しい値を追加するのではなく、特定のプロパティの表現を変換することを意図していると思います。

于 2014-01-17T22:35:19.477 に答える