Spring MVCで文字エンコーディングがUTF8で表示されないので苦戦したが、どうやらエンコードで使っていたフィルターの順序が問題だったようなので、1番目に設定したらエンコード問題がなくなった。
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
http://stackoverflow.com/questions/16029269/utf-8-encoding-with-form-post-and-spring-controller
2015年12月2日水曜日
2014年6月3日火曜日
SpringでJSONを返す場合に、特定のフィールドを表示させ無いようにするにはObjectMapperのaddMixInAnnotationsを使う。
SpringでJSONを返す場合に、特定のフィールドを表示させ無いようにするには、JacksonのObjectMapperで、addMixInAnnotationsに表示させたく無いフィールドを設定した抽象クラス、もしくはインターフェイスを大元のJSONオブジェクトにマップしたクラスに教えてやる。
Snippet
http://stackoverflow.com/questions/22609079/how-to-filter-the-json-response-returning-from-spring-rest-web-service
http://fasterxml.github.io/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/ObjectMapper.html#addMixInAnnotations(java.lang.Class, java.lang.Class)
Snippet
@Controller
public class SubjectController
{
private ObjectMapper _objectMapper = new ObjectMapper();
public Controller()
{
_objectMapper.getSerializationConfig().addMixInAnnotations(Base.class, FieldsNotAvailable.class);
}
@RequestMapping(value="/path", method={RequestMethod.GET})
public @ResponseBody String getJson(ModelMap model)
{
return _objectMapper.writeValueAsString(subject);
}
}
public abstract class FiledsNotAvailable
{
@JsonIgnore
public abstract String getSomeField();
}
http://stackoverflow.com/questions/22609079/how-to-filter-the-json-response-returning-from-spring-rest-web-service
http://fasterxml.github.io/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/ObjectMapper.html#addMixInAnnotations(java.lang.Class, java.lang.Class)
2013年12月3日火曜日
Springで独自のフィルターを使いたい場合
Spring Securityを使う以前に簡単にフィルターを使いたいなと思い、Springではどうやって使うのだろうと調べてみました。
http://srlawr.blogspot.com/2011/09/creating-custom-filter-in-spring.html
ミソとしては、org.springframework.web.filter.DelegatingFilterProxyに自分でカスタマイズしたFilterをbeanとして設定してやれば良いようです。このフィルタはorg.springframework.web.filter.OncePerRequestFilterを実装した例が多かったので、これを実装したけど、、、これで良いのかな??
そしてパラメーターはinit-paramで渡せるようです。
http://stackoverflow.com/questions/5807922/how-does-spring-wire-a-onceperrequestfilter-with-its-init-param-values
javax.servlet.Filterだとダメなのだろうか??動いてはいるのですが、ブラックボックスなとこがあるのでちょっと心配です。
http://srlawr.blogspot.com/2011/09/creating-custom-filter-in-spring.html
ミソとしては、org.springframework.web.filter.DelegatingFilterProxyに自分でカスタマイズしたFilterをbeanとして設定してやれば良いようです。このフィルタはorg.springframework.web.filter.OncePerRequestFilterを実装した例が多かったので、これを実装したけど、、、これで良いのかな??
そしてパラメーターはinit-paramで渡せるようです。
http://stackoverflow.com/questions/5807922/how-does-spring-wire-a-onceperrequestfilter-with-its-init-param-values
javax.servlet.Filterだとダメなのだろうか??動いてはいるのですが、ブラックボックスなとこがあるのでちょっと心配です。
Spring SecurityのバージョンがSpring Frameworkと違うのでかなりハマりました。
Spring Securityを使う場合、これを書いている時点では3.1.4.RELEASEが最新だったのですが、Spring Frameworkの最新バージョン(3.2.4.RELEASE)と違うんだなと何気にpom.xmlに追加してmavenを走らせたらどえらくハマりました。。。
エラーエラーの連発で、どこの何がまずいのかメッセージを見てもサッパリ。ネットでいろいろ調べてみると、やっとの事で見つけました。
http://stackoverflow.com/questions/16801639/spring-core-3-2-2-spring-security-3-1-4-java-lang-incompatibleclasschangeerro
http://www.mkyong.com/mongodb/spring-asm-dependency-issue-in-spring-data/
要するにSpring Securityの3.1.4.RELEASEはSpringの3.0.7に依存してるので、裏で読み込まれているjarが3.0.7の物がいくつかあり、これがSpring 3.2.4と喧嘩してしまっている状態。どうやらここがハマった原因だったようです。mvn dependency:treeで確認。
解決方法としては、3.0.7でなくて3.2.4を明示的に読み込ませればOK。pom.xmlのdependencyManagementタグ内で古いjarを読み込んでるパッケージを明示的に3.2.4にしてやれば見事解決しました。
なぜSpringとSpring Securityでバージョンが違うのか?
なぜSpring Securityは最新のバージョンを読み込まないのか?
ここら辺が疑問ですが、こういう類のエラーは本当にSpringの嫌なとこですね。エラーメッセージを見ても分からないし、mvn dependency:treeなんてコマンド、今回初めて知りました。
ちょっと原因らしきことが書いてあります。異なるバージョンのjarを読み込んだ場合の優先度や明示的にpom.xmlで指定する話など。解決方法としてはいいけど、その都度mvn dependency:treeで調べないといけないのか。Spring SecurityをSpringの一部にすればいいのに。。
http://www.baeldung.com/spring-security-with-maven
エラーエラーの連発で、どこの何がまずいのかメッセージを見てもサッパリ。ネットでいろいろ調べてみると、やっとの事で見つけました。
http://stackoverflow.com/questions/16801639/spring-core-3-2-2-spring-security-3-1-4-java-lang-incompatibleclasschangeerro
http://www.mkyong.com/mongodb/spring-asm-dependency-issue-in-spring-data/
要するにSpring Securityの3.1.4.RELEASEはSpringの3.0.7に依存してるので、裏で読み込まれているjarが3.0.7の物がいくつかあり、これがSpring 3.2.4と喧嘩してしまっている状態。どうやらここがハマった原因だったようです。mvn dependency:treeで確認。
解決方法としては、3.0.7でなくて3.2.4を明示的に読み込ませればOK。pom.xmlのdependencyManagementタグ内で古いjarを読み込んでるパッケージを明示的に3.2.4にしてやれば見事解決しました。
なぜSpringとSpring Securityでバージョンが違うのか?
なぜSpring Securityは最新のバージョンを読み込まないのか?
ここら辺が疑問ですが、こういう類のエラーは本当にSpringの嫌なとこですね。エラーメッセージを見ても分からないし、mvn dependency:treeなんてコマンド、今回初めて知りました。
ちょっと原因らしきことが書いてあります。異なるバージョンのjarを読み込んだ場合の優先度や明示的にpom.xmlで指定する話など。解決方法としてはいいけど、その都度mvn dependency:treeで調べないといけないのか。Spring SecurityをSpringの一部にすればいいのに。。
http://www.baeldung.com/spring-security-with-maven
2013年11月21日木曜日
SpringのControllerでリクエストパラメーターが多い時はMultiValueMapを使う
SpringのControllerでリクエストパラメーターをたくさん受け取る場合、org.springframework.util.MultiValueMapを使うと便利。
パラメーター(キー)がユニークな場合は、MultiValueMap<String,String>なんでgetFirst(K key)で、パラメーター(キー)に紐付けられた値が複数ある場合は、MultiValueMap<String,List<String>>をget(Object key)で取れる。
http://docs.spring.io/spring/docs/3.1.4.RELEASE/javadoc-api/org/springframework/util/MultiValueMap.html
http://stackoverflow.com/questions/16355168/spring-mvc-requestparam-as-map-get-url-array-parameters-not-working
パラメーター(キー)がユニークな場合は、MultiValueMap<String,String>なんでgetFirst(K key)で、パラメーター(キー)に紐付けられた値が複数ある場合は、MultiValueMap<String,List<String>>をget(Object key)で取れる。
http://docs.spring.io/spring/docs/3.1.4.RELEASE/javadoc-api/org/springframework/util/MultiValueMap.html
http://stackoverflow.com/questions/16355168/spring-mvc-requestparam-as-map-get-url-array-parameters-not-working
2013年11月6日水曜日
とりあえずSpring+Hibernateで、DAO(データレイヤー)をJUnit4でテストする上で分かったことをまとめた。
まだ謎が多いので、分かった事をとりあえず一覧で。
- JUnit4で作ったクラスはAbstractTransactionalJUnit4SpringContextTestsを継承する。なぜ?
- spring-test.jarをpom.xmlに追加
- @RunWith(SpringJUnit4ClassRunner.class)をクラスレベルで書く。なぜ必要?
- @ContextConfiguration(locations={classpath:applicationContext.xml, classpath:hibernate.cfg.xml})をクラスレベルで書いて、設定ファイルを読み込む。この設定ファイルはクラスパスがとおった
- @TransactionConfiguratioをクラスレベルで書いて、defaultRollback=trueにする。ロールバック機能を使うと、データベースの状態をテスト前の状態にできるから便利。
- public void setDataSource(DataSource dataSource)をオーバーライドする。@Resource(name="dataSource")で設定ファイルで指定されているdataSourceを指定。
とにかくハマったとこ。。。
- Maven+Eclipse+WTPのファイル構造で設定ファイルをsrc/main/webapp/WEB-INF/は、クラスパス上にはならないので、src/test/resourceにテスト用の設定ファイルをtest-applicationContext.xml, test-hibernate.cfg.xmlのようにコピーした。もっと賢いやり方ないのかな。。。?ただ、WEB-INFから設定ファイルは動かしたくない。
- setDataSourceでtest-hibernate.cfg.xmlからDBのコネクション情報を指定してあげないといけないのだが、<session-factory></session-factory>の中に一括して書いてあるので、コネクション上に関してだけ抜き出して、applicationContext.xmlでdataSourceとして書きだした。
多くに共通してるとこは、設定の仕方が多い事が仇になっているということ。それがSpringとかHibernateの分かりにくいとこなのかなと実感。
参考にしたサイト:
http://stackoverflow.com/questions/2377763/abstracttransactionaljunit4springcontexttests-cant-get-the-dao-to-find-inserte
http://zakato.sblo.jp/article/50155918.html
http://java-cauldron.blogspot.com/2012/07/writing-junit4-tests-spring-30.html
http://mvnrepository.com/artifact/org.springframework/spring-test/3.2.4.RELEASE
http://kinoushi.blogspot.com/2008/08/abstracttransactionaljunit4springcontex.html
http://stackoverflow.com/questions/17220432/failed-to-load-applicationcontext-for-junit-test-of-spring-controller
http://junit.sourceforge.net/javadoc/org/junit/Assert.html
http://intink.blogspot.com/2012/12/hibernate4spring-framework3.html
http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/testing.html#testcontext-fixture-di
http://forum.spring.io/forum/spring-projects/container/38874-transactional-junit4-controller-testing-with-multiple-datasources
http://forum.spring.io/forum/spring-projects/container/49585-how-to-get-contextconfiguration-using-web-inf-applicationcontext-xml
http://forum.spring.io/forum/spring-projects/web/97105-testing-problem-junit4-7-spring3-0-5-hibernate-3-3-2
ラベル:
Eclipse WTP,
Hibernate,
JUnit4,
Spring
登録:
投稿 (Atom)