読者です 読者をやめる 読者になる 読者になる

SpringMVCでjsonとxmlを返すときハマったところめも

Spring Java

大枠は以下を参考に。
Spring 3 MVC の HttpMessageConverter 機能を使って RESTful な Web サービスを作成する

@ResponseBodyでクラスを返すときにnullのフィールドを結果に含めたくない

XMLとjsonの変換にはそれぞれJaxb2Marshallerとjacksonを使いました。
Jaxb2Marshallerの方はフィールドがnullだとデフォルトで結果に含めないみたい。
jacksonの方はクラスに以下を付与してやればいいみたい。

@JsonSerialize(include = Inclusion.NON_NULL)
public class TestResultBean {

べんり!

XMLで返すときのルートのElement名を指定したい

クラスに@XmlRootElementを付与するだけだと…

@XmlRootElement
public class TestResultBean {

結果はこんなかんじ。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><testResultBean><count>0</count><success>true</success></testResultBean>


@XmlRootElementのname属性に明示的にルートのElement名としたいものを指定してやると…

@XmlRootElement(name="response")
public class TestResultBean {

結果は…

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><response><count>0</count><success>true</success></response>

できた!

条件に合わせてレスポンスコードを変更したい

ExceptionHandlerを使って発生したExceptionにあわせてResponseStatus指定して結果を返そうと思ったんですが、どうやら3.1M1からしかExceptionHandlerではResponseBodyが使えないっぽい。
[#SPR-6902] @ResponseBody does not work with @ExceptionHandler - Spring Projects Issue Tracker
使ってるのが3.0.xなのと、仮に使えてもなんかたとえば401返したいときにそのために独自でException作るのもなんかいやんな気がしたので結局実行するメソッドの引数にHttpServletResponseを含めてsetStatusする感じにしました。

スポンサーリンク