2012-05-22 4 views
4

나는 이것을 이해하려고 애 쓰면서 꽤 오래 동안 보냈다. 나는 사용자 이름과 암호를받는 서비스를 작성하는 중입니다. 그런 다음 프로세서를 사용하여 메시지의 출력 부분에 반환되는 인증 토큰을 생성합니다. JSON 형식의 매개 변수를 허용하고 형식 변환이 올바르게 작동하도록하려고합니다. 나는 아래있는자가 포함 된 단위 테스트에 문제를 감소했습니다Apache Camel에서 JSON 마샬링의 간단한 예제가 작동하지 않는 이유는 무엇입니까?

import org.apache.camel.Exchange; 
import org.apache.camel.Processor; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.model.dataformat.JsonDataFormat; 
import org.apache.camel.model.dataformat.JsonLibrary; 
import org.apache.camel.test.junit4.CamelTestSupport; 
import org.junit.Test; 
import com.thoughtworks.xstream.annotations.XStreamAlias; 


public class BasicJsonMarshallingTest extends CamelTestSupport { 

@Override 
protected RouteBuilder createRouteBuilder() throws Exception { 
    final Processor simpleProcessor = new Processor() { 
     @Override public void process(Exchange exchange) throws Exception { 
      SimpleBean bean = exchange.getIn().getBody(SimpleBean.class); 
      if(bean == null){ 
       return; 
      } 
      exchange.getOut().setBody("a=" + bean.getA() + " b=" + bean.getB()); 
     } 
    }; 

    return new RouteBuilder() { 
     @Override public void configure() throws Exception { 
      JsonDataFormat jsonFormat = new JsonDataFormat(JsonLibrary.XStream); 
      jsonFormat.setUnmarshalType(SimpleBean.class); 
      from("direct:service").unmarshal(jsonFormat).process(simpleProcessor); 
     } 
    }; 
} 

@Test 
public void testSuccessfulAuthentication(){ 
    Exchange lAuthRequest = createExchangeWithBody("{\"simple\":{\"a\":\"v1\",\"b\":\"v2\"}}"); 
    template.send("direct:service", lAuthRequest); 
    assertEquals("a=v1 b=v2", lAuthRequest.getOut().getBody()); 
} 

@XStreamAlias("simple") 
public static final class SimpleBean { 

    private String a; 
    private String b; 

    public void setA(String a) { 
     this.a = a; 
    } 
    public String getA() { 
     return a; 
    } 
    public void setB(String b) { 
     this.b = b; 
    } 
    public String getB() { 
     return b; 
    } 

} 

} 

나는이 테스트를 실행할 때, 나는 콘솔에서이 예외를 얻을 :

com.thoughtworks.xstream.mapper.CannotResolveClassException: simple 
    at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:56)[xstream-1.4.1.jar:] 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)[xstream-1.4.1.jar:] 
    <snip> 

는 어떻게 든이 문제를 접근 오전 ? 도와주세요!

답변

7

이 작업을 수행하는 한 가지 방법을 찾았습니다. 내 JSON 파서로 잭슨으로 바꿨다.

return new RouteBuilder() { 
     @Override public void configure() throws Exception { 
      from("direct:service").unmarshal().json(JsonLibrary.Jackson, SimpleBean.class).process(simpleProcessor); 
     } 
    }; 

나는이에서 와이어를 통해 전송되는 JSON의 형식을 변경했다 : 이렇게하려면 내가했던 일은,이에 RouteBuilder을 변경했다

{ "간단" { "A": "V1", "B": "V2"}} (I보다 어쨌든처럼)이 행

:

{ "A": "V1", "B": " v2 "}

관련 문제