ラベル Spring の投稿を表示しています。 すべての投稿を表示
ラベル Spring の投稿を表示しています。 すべての投稿を表示

2015年12月2日水曜日

SpringでUTF8エンコードで表示されない問題の解決方法

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

2014年6月3日火曜日

SpringでJSONを返す場合に、特定のフィールドを表示させ無いようにするにはObjectMapperのaddMixInAnnotationsを使う。

SpringでJSONを返す場合に、特定のフィールドを表示させ無いようにするには、JacksonのObjectMapperで、addMixInAnnotationsに表示させたく無いフィールドを設定した抽象クラス、もしくはインターフェイスを大元のJSONオブジェクトにマップしたクラスに教えてやる。

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だとダメなのだろうか??動いてはいるのですが、ブラックボックスなとこがあるのでちょっと心配です。

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



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

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を指定。
とにかくハマったとこ。。。

  1. Maven+Eclipse+WTPのファイル構造で設定ファイルをsrc/main/webapp/WEB-INF/は、クラスパス上にはならないので、src/test/resourceにテスト用の設定ファイルをtest-applicationContext.xml, test-hibernate.cfg.xmlのようにコピーした。もっと賢いやり方ないのかな。。。?ただ、WEB-INFから設定ファイルは動かしたくない。
  2. 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