블로그 이미지
Max.

calendar

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

Notice

2011.09.23 16:59 Business관련

src/main/resources/META-INF/spring/website.properties
src/main/resources/META-INF/spring/restcode.properties
src/main/resources/META-INF/spring/database.properties



보통 property-placeholder는 다음 처럼 설정한다.

<context:property-placeholder location="classpath*:META-INF/spring/*.properties" /> 



classpath*: 라는 prefix를 이용해서 모든 클래스패스에 있는 위 경로에 프로퍼티를 찾아 읽어 들이라는 설정이다. 보통 원하는대로 잘 동작한다.

그런데 오늘 동작하지 않았다. 아래와 같이 * 를 제거하면 해당 프로젝트(메이븐 멀티프로젝트의 여러 리소스를 대상으로하는것이 아닌)에 있는 프로퍼티만 읽어 들여서 잘 동작한다.

<context:property-placeholder location="classpath:META-INF/spring/*.properties" />



이미 멀티프로젝트로 가야 하니 위와 같은 방법을 쓸수 없었다. 안되는 원인은 확인할수 없었다. 표현식에 문제가 있을꺼라는 짐작밖엔..., 해서 간단히 표현식을 우회하는 트릭을 생각해 낸것이 모든 프로퍼티에 접두어를  넣는 방법으로 해결했다.

src/main/resources/META-INF/spring/xxx-website.properties
src/main/resources/META-INF/spring/xxx-restcode.properties
src/main/resources/META-INF/spring/xxx-database.properties



<context:property-placeholder location="classpath*:META-INF/spring/xxx-*.properties" />



위와 같이 xxx라는 파일 접두어를 붙여서 슬래쉬(/) 다음에 바로 아스테르크(*) 가 오는 대신 영문자가 와서 표현에 무리없이 인식한다.


저작자 표시
신고

'Business관련' 카테고리의 다른 글

property-placeholder에서 classpath*: 오류  (0) 2011.09.23
돌연변이 변수 투입시점  (0) 2011.07.20
홀로서기(1) - 기초 정보 모으기  (0) 2011.07.01
사육사와 조련사  (0) 2011.06.10
Social Game 개발  (0) 2011.04.26
Google Apps Marketplace  (0) 2011.04.26
posted by Max.
2011.09.22 08:53 개발관련
ContentNegotiatingViewResolver 를 사용하면서 BeanNameViewResolver를 사용한다는게 단순하게 되지 않았다. 아래처럼 설정하면 될것 같지만,

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
   <map>
       <entry key="html" value="text/html"/>
       <entry key="xml" value="text/xml"/>
       <entry key="json" value="application/json"/>
                        <entry key="xls" value="#{ themeExcelView.getContentType() }"/> 
   </map>
</property>
<property name="viewResolvers">
   <list>
   <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/views/" p:suffix=".jsp"/>
   </list>
</property>
<property name="defaultViews">
   <list>
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
    </list>
</property>
</bean>



안된다. 무슨 이유인지  viewResolvers 들이 제대로 동작 하지 않는다. 아마도 적절한 key(Header)를 찾지 못하여 매핑이 이루어 지지 않는듯 하다. 해서, ContentNegotiatingViewResolver 에서 매핑되지 않는것을 다시 BeanNameViewResolver로 매핑하게 하면 해결된다. 즉 아래처럼 설정하면, 
 

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
   <map>
       <entry key="xml" value="text/xml"/>
       <entry key="json" value="application/json"/>
   </map>
</property>
<property name="viewResolvers">
   <list>
    <ref bean="beanNameViewResolver"/>
    <ref bean="internalResourceViewResolver"/>
   </list>
</property>
<property name="defaultViews">
   <list>
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
    </list>
</property>
<property name="order" value="1"/>
<property name="ignoreAcceptHeader" value="true"/>
</bean>
    <bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="2"/>
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/views/" p:suffix=".jsp"/>


ContentNegotiatingViewResolver 에서 매핑되지 않은 뷰들은 아래 뷰리졸버(BeanNameViewResolver)에 의해서 다시 매핑을 시도할것이다. 설정이 어째 중복되는듯해서 찜찜하지만, 어노테이션으로 AbstractExcelView를 확장한 각종 Excel뷰를 매핑하기 위해 어쩔수는 선택이였다.

ContentNegotiatingViewResolver 를 제대로 알면, 우화한 방법이 있을듯 한데...  ContentNegotiatingViewResolverTests.java 를 보면서 좀더 학습해야 할듯 하다. 


 
저작자 표시
신고
posted by Max.
2011.09.05 11:39 개발관련
사실은 jeus5에서 사용하는 java 버전 스팩에 관한 문제이다.

1) JSTL, EL Exception
Jeus5.0에서 JSTL 1.2  을지원 하지 않는 문제이다. 1.1로 낮추고, apache의 taglibs.jar를 별도로 추가해야 된다.

2) jersey-json 1.2 에서 JAXB Exception
Jeus5.0에서 JAXB2.x 버전을 지원 하지 않는 문제이다. jersey-json 소스를 수정하여 JAXB2.X 와 의존성를 제거해야 한다. 쉽지 않다. 차라리 Spring RestTemplate를 사용하고, .Castor 같은 걸로 처리하는게 빠르다.  Hibernate validation 같은 JAXB2 관련 의존성을 사용해도 무방하다. JAXB1과 충돌하지 않으니까...



 
저작자 표시
신고
posted by Max.
TAG jeus5
2011.09.01 08:40 개발관련

1) ExternalInterface.call 예제

최초 Flex App이 웹화면에 띄워질때 Javascript function을 읽어 들인다. 

mxml

private function getData(event:MouseEvent):void{
searchDate = ExternalInterface.call( "getFlexDate", "test");
if(searchDate.context == null){
searchDate = new Object();
searchDate.context = "http://localhost:8088";
searchDate.startDate = "2011-08-01";
searchDate.endDate = "2011-08-29";
searchDate.selectId="";
}
searchDate.context = searchDate.context + amf;
//Alert.show(searchDate.context + " : " + searchDate.startDate + " ~ " + searchDate.endDate); 
callChanel(searchDate);
}
private function callChanel(sd:Object):void{
var ch:AMFChannel = new AMFChannel();
ch.url = sd.context;
ch.id = "amf";
remotingChannels  = new ChannelSet();
remotingChannels.addChannel(ch);
channelHandler(sd.startDate, sd.endDate);


Html(Javascript)

function getFlexDate(txt){
var searchDate = new Object();
searchDate.startDate = "2011-08-01";
searchDate.endDate = "2011-08-19";
searchDate.context="http://localhost:8088";
searchDate.country="";
return searchDate;
}


최초 시작시 관련 값을 읽을때 편리한다. 

 
2)  ExternalInterface.addCallback  예제

Javascript 로 특정 Flex(Actionscript) function을 호출 하고자 할때, 예를 들어 검색폼이 Html이고, 그값을 Flex에 전달하고 싶을때 사용한다.

mxml

       //creationComplete="init()" 이 상단에 선언되 있음.

            [Bindable] public var searchDate:Object;
    public var realFunction:Function = callFlexReal;
 
private function init():void{
ExternalInterface.addCallback("callFlex", realFunction);
}
 
  public function callFlexReal(sd:Object):void {
sd.context = sd.context + amf;
searchDate = sd;
//Alert.show(searchDate.context + " : " + searchDate.startDate + " ~ " + searchDate.endDate); 
callChanel(searchDate);
}


Html(Javascript)


function callFlex() {
            var searchDate = new Object();
searchDate.context = "http://localhost:8088";
searchDate.startDate = "2011-08-01";
searchDate.endDate = "2011-08-29";
searchDate.country="";
alert(searchDate);
            getMovieName("${application}").callFlex(searchDate); 
            }

            function getMovieName(movieName) {
           if (navigator.appName.indexOf("Microsoft") != -1) {
            return window[movieName]
           }else {
            return document[movieName]
           }
            }

<a href="#" onclick="callFlex()">callFlex()</a>


 
 ${application}는 flash object tag 아이디 명이다. flex builder를 사용한다면, index.template.html 에당 코드를 볼수 있고, 대략 정의하면 된다.   ExternalInterface.addCallback은 한번에 안되었는데, 이유가 이 플래시 Object 아이디명을 정확하게 설정하지 않아서 였다.
저작자 표시
신고
posted by Max.
prev 1 next