This will cause infinitely deep XML

Java | 2008. 12. 7. 01:48 | Posted by G.N.Jeong J.#

JPA를 이용해서 도메인 객체를 제공 받았는데, 그 도메인 객체가 하위의 객체와 서로 양방향 참조를 하고 있을 때, XML로 변환하려고 하면 제목과 같은 에러 메세지를 만날 수 있다.

구글링을 해 본 결과, 양방향 참조를 일방적으로 Null로 설정해주는 방법이 있었고,
@XmlTransient를 이용해서 양방향 참조가 일어나는 메소드에 설정해 주는 방법이 있었다.

하위 객체가 다시 상위객체를 참조할 경우( getParent() 같은 상위를 다시 참조하는 메소드)에 @XmlTransient를 설정해 준다.

그러면 객체가 별다른 설정 없이도 XML로 변환이 된다.

https://jira.jboss.org/jira/browse/JBSEAM-3268

댓글을 달아 주세요

failed to lazily initialize a collection of role

Java/Spring | 2008. 12. 7. 01:16 | Posted by G.N.Jeong J.#
Spring 2.5.x + JPA(Hibernate)를 이용하여 하위리스트를 포함하는 도메인 객체를 불러왔을 때, 기본값인  LAZY 로딩이 되지 않았다.

구글링을 해 본 결과 LAZY 로딩은 트랜젝션 범위내에서 이루어질 수 있다는 답변이 있었다.

그래서 Spring XML설정에서 트랜젝션 관리자를 선언해 주고 설정해 주었지만 되지 않았다.
이유인 즉, Test 코드가 있는 클래스가 설정한 트랜젝션 범위에서 벗어나 있었기 때문이었다.

따라서 @Transactional 이라는 어노테이션을 테스트 클래스에 붙여주고 테스트 하니, 정상적으로 출력이 되었다.

기본적으로 트랜젝션은 annotation을 적용시, annotation이 적용된 메소드가 끝날 때 마무리 된다.
물론 이미 상위 메소드에서 트랜젝션이 있었다면, 기본값인 경우 그 상위 메소드가 끝날 때 마무리 된다.
TAG JPA, LAZY, Spring

댓글을 달아 주세요


FTP로 원격 디렉토리 리스트를 가져오는 것을 해보고 싶었다.
무엇보다 스스로의 성취감도 중요하겠지만,
각 스크립트 언어별로 얼마나 다른지 확인해 보고 싶기도 했다.

// groovy script

import sun.net.ftp.FtpClient
import java.io.BufferedReader
import java.io.inputStreamReader

def getList(is){
 br = new BufferedReader(new InputStreamReader(is))
 while ( (result = br.readLine()) !=  null) list += result + "\r\n"
 return list
}

ftp = new FtpClient()
ftp.openServer('serverurl')
ftp.login('loginid','password')
ftp.cd('/home/loginid/test')
is = ftp.list()
println getList(is)


/* Javascript(Rhino) */

importClass(Pacakges.sun.net.ftp.FtpClient)
importClass(java.io.BufferedReader)
importClass(java.io.InputStreamReader)

function getList(is){
 var result = 0;
 var list = '';
 var br = new BufferedReader(new InputStreamReader(is));
 while( (result = br.readLine()) != null) list += result + "\r\n";
 return list;
}

var ftp = new FtpClient();
ftp.openServer('serverurl');
ftp.login('loginid','password');
ftp.cd('/home/loginid/test');
is = ftp.list();
print( getList(is));


// ruby script

require 'net/ftp'

ftp = Net:FTP.new('serverurl','loginid','password')
ftp.chdir('/home/loginid/test')
list = ftp.list()
puts list


전체적으로 보면 Ruby가 훨씬 간결하고 직관적인 것을 알 수가 있었다.
또한, Java 기반인 두 스크립트(Javascript, Groovy)는 사용방법이 같아서 소스가 거의 같았다.
(내가 아직 두 스크립트를 간결하게 사용하는 법에 미숙하다)

스크립트는 컴파일 안해도 되고 바로 결과 확인이 되니까 재미있는 것 같다. :)

댓글을 달아 주세요

Hello World

Java/javafx | 2008. 12. 1. 00:03 | Posted by G.N.Jeong J.#

/*
* HelloJFX.fx-AJavaFXScript "HelloWorld"styleexample
*
* Developed2007byJamesL. Weaver(jim.weaverat jmentor dot com)
*/
packagejfx_book;
import javafx.ui.*;
import javafx.ui.canvas.*;
Frame{
    title: "HelloWorld-styleexampleforJavaFXScript"
    height: 100
    width: 400
    content:
        Canvas{
        content:
            Text {
                font:
                    Font {
                        faceName: "SansSerif"
                            style: BOLD
                            size: 24
                        }
                        x: 10
                        y: 10
                    content: "HelloJavaFXScript Developer!"
                }
            }
        // ShowtheFrameonthescreen
        visible: true
}

JavaFXPad에서는 제대로 동작하지만, NetBeans에서 작성할 때는 제대로 동작하지 않았다.
그 이유는 패키지 이름이 변경되었기 때문이다.

javafx.ui 패키지가 존재하지 않아 빌드 실패 및 구동 실패 하였기 때문에 원인을 찾던 중
JavaFX forum에서 javafx.ui 패키지를 javafx.application으로 변경하면 동작한다는 글을 보고 아래와 같이 변경하였다.

package hellojfx2;

import javafx.application.*;
import javafx.scene.*;
import javafx.scene.text.*;
import javafx.scene.paint.*;

Frame{
    title: "HelloWorld-styleexampleforJavaFXScript"
    height: 100
    width: 400
    stage:
        Stage{
            fill: Color.ORANGE
            content:
                    Text {
                        font:
                            Font {
                                name: "Sans Serif"
                                style: FontStyle.BOLD
                                size: 24
                            }
                        x: 10
                        y: 30
                        content: "HelloJavaFXScript Developer!"
                    }        
        }
    visible: true
}

Canvars 대신에 Stage객체로 바뀌었고 Font 객체에 들어가는 font style도 일반 텍스트에서 FontStyle의 상수로 바뀌었다.

아무래도 책을 보려면 소스 코드를 많이 바꾸면서 해야 할 것 같다.

본 예제는 JavaFX Script (James L.Weaver)를 공부하면서 작성하였다.

댓글을 달아 주세요

커맨드 객체 인코딩이 깨질 때

Java/Spring | 2008. 8. 12. 15:54 | Posted by G.N.Jeong J.#
Tomcat 설정 (server.xml)도 해보고 MySQL 설정도 해 보았으나,
커맨드 객체의 값은 여전히 깨져있었다.

그래서 web.xml에 필터를 넣어주었다.

  <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>
  </filter>
 
  <filter-mapping>
      <filter-name>encodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>


Spring에서 기본적으로 지원하는 인코딩필터다.
이 후에는 커맨드 객체의 값이 깨지질 않고 잘 바인딩 되었다.

댓글을 달아 주세요