2011-09-19 3 views
0

개체를 JSON과 XML로 직렬화 할 수있는 웹 서버를 구축하려고합니다. Jackson (예제 프로젝트 사용)을 통합 했으므로 REST 인터페이스를 통해 JSON 직렬화 된 객체에 액세스 할 수 있지만 XML도 얻고 싶습니다.JSON (Jackson 프로세서)과 XML (XStream)간에 전환하거나 동시에 사용할 수 있습니까?

이 ...

@Controller 
@RequestMapping("/main/ajax") 
public class AjaxController { 

@RequestMapping(value = "/blah", method = RequestMethod.GET, headers = "Accept=application/xml") 
public @ResponseBody List<String> blah(@RequestParam(value="input") String input){ 

      List<String> stringList = new LinkedList<String>(); 
      stringList.add("i"); 
      stringList.add("am"); 
      stringList.add("an"); 
      stringList.add("json object"); 
      stringList.add(input); 

      return stringList; 
    } 
} 

오순절이 쿼리는 :

["i","am","an","json object","foobar"] 

어떤 힌트 :

http://localhost:8080/spring-json/krams/main/ajax/blah?input=foobar 

는 출력을 생성?

업데이트 # 1 : 나는에 ContentNegotiatingViewResolver ...

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="order" value="1" /> 

    <property name="mediaTypes"> 
    <map> 
     <entry key="json" value="application/json" /> 
     <entry key="xml" value="application/xml" /> 
    </map> 
    </property> 

    <property name="defaultViews"> 
    <list> 

     <!-- JSON View --> 
     <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 

     <!-- XML View --> 
     <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 
     <constructor-arg> 
      <bean class="org.springframework.oxm.xstream.XStreamMarshaller" /> 
     </constructor-arg> 
     </bean> 

    </list> 
    </property> 

    <property name="ignoreAcceptHeader" value="true" /> 
</bean> 

<!-- If no extension matched, use JSP view --> 
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="order" value="2" /> 
    <property name="prefix" value="/WEB-INF/jsp/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 

어떻게 내가 지금 XML 또는 JSON 중 하나를 선택합니까 구현? localhost : 8080/spring-json/sometestclass/status? localhost : 8080/spring-json/sometestclass/status.xml? localhost : 8080/spring-json/sometestclass/status.json? 예제

없음 위의 작업을하지 않습니다,하지만 난 동의 헤더를 "응용 프로그램/XML"또는 "응용 프로그램/JSON"로 응답 포맷을 강제 할 수 ... 내가 할 경우 ... 다음

@RequestMapping(value = "/status", method = RequestMethod.GET, headers = "Accept=application/xml, application/json") 
public @ResponseBody Web_ServerStatus isServerAlive() { 
    Web_ServerStatus l_ReturnObj = new Web_ServerStatus(); 

... XML 만 다시 가져옵니다.

내가 겪고있는 문제는 무엇입니까?

미리 감사드립니다.

+0

질문을 조금 바꾸어 말하다 할 수 있습니다없이; JSON 인터페이스도 REST 인터페이스가 될 수 있습니다 ... 그래서 아마 XML 인터페이스 대 JSON 인터페이스를 의미할까요? – StaxMan

+0

네가 맞아 StaxMan, 고마워! -> 편집 : – Knutwurst

답변

1

네, 스프링으로 태그를 포함 했으므로 ContentNegotiatingViewResolver를 살펴보십시오.

여기는 링크 : http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-multiple-representations입니다.

그러나 REST는 XML을 의미하지 않습니다. 클라이언트의 수락 헤더 및 서비스 기능에 따라 다양한 방법으로 리소스를 렌더링 할 수 있습니다.

+0

안녕하세요, 답변 주셔서 감사합니다 ...하지만 난 받아 들일 헤더의 모든 종류의 사용 싶지 않아. JSON/XML과 같은 특정 출력 유형에 대한 응답을 강제로 수행하고 .xml .json과 같은 점 표기법에 대한 내용을 읽거나 ... 더 좋게는 ... 기본적으로 내 서버는 XML을 반환하지만 if ".json"을 URI에 추가하면 JSON이 반환됩니다 ... 가능합니까? – Knutwurst

0

솔루션 :

@RequestMapping(value = "/status", method = RequestMethod.GET) 
public Web_ServerStatus isServerAlive() { 
    ... 
} 

"@ResponseBody"

+0

좋습니다. 나는 네가 가진 걸 알아 차리지 못했지만 이해가된다. @ResponseBody 어노테이션은 응답이보기 분석을 우회해야 함을 나타냅니다. 이제 접미사를 기반으로 표현을 전환 할 수 있습니까? –

+0

예, ""XML을 기본적으로 가져 오지만 ".json"을 추가하면 JSON으로 전환 할 수 있습니다. – Knutwurst

관련 문제