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