Porównaj ceny domen i usług IT, sprzedawców z całego świata

Spring MVC odpoczywa odpowiedź JSON i XML


Mam wymóg zwrotu wyniku z bazy danych lub jako ciąg do struktury XML lub jako struktury JSON.
Mam rozwiązanie, ale nie wiem, czy to najlepszy sposób na rozwiązanie tego problemu.
Tutaj mam dwie metody:
@RequestMapping(value = "/content/json/{ids}", method = RequestMethod.GET)
public ResponseEntity<String> getContentByIdsAsJSON(@PathVariable("ids") String ids)
{
String content = null;
StringBuilder builder = new StringBuilder();
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Type", "text/html; charset=utf-8");
// responseHeaders.add("Content-Type", "application/json; charset=utf-8"); List<String> list = this.contentService.findContentByListingIdAsJSON(ids);
if (list.isEmpty())
{
content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><error>no data found</error>";
return new ResponseEntity<String>(content, responseHeaders, HttpStatus.CREATED);
}
for (String json : list)
{
builder.append(json + "\n");
}
content = builder.toString();
return new ResponseEntity<String>(content, responseHeaders, HttpStatus.CREATED);
}@RequestMapping(value = "/content/{ids}", method = RequestMethod.GET)
public ResponseEntity<String> getContentByIdsAsXML(@PathVariable("ids") String ids)
{
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Type", "application/xml; charset=utf-8"); String content = this.contentService.findContentByListingIdAsXML(ids);
if (content == null)
{
content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><error>no data found</error>";
return new ResponseEntity<String>(content, responseHeaders, HttpStatus.CREATED);
}
return new ResponseEntity<String>(content, responseHeaders, HttpStatus.CREATED);
}

do pierwszej metody potrzebuję lepszego rozwiązania, o które już tutaj pytałem:

Wiosna MVC Odpoczynek Mongo Odpowiedź
https://coderoad.ru/6466063/
obiekt bazy danych
Kolejnym ważnym punktem jest to, że włożono do konfiguracji konwertera JSON:
<bean id="jsonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json"/>
</bean>

Kiedy zmieniam typ treści w pierwszej metodzie "Aplikacja/JSON", działa, ale wtedy odpowiedź XML już nie działa, ponieważ konwerter JSON chce konwertować ciąg XML do struktury JSON, myślę.
Co mogę zrobić, aby wiosna określa różnicę, że jedna metoda powinna zwrócić typ JSON, a drugi zwykły XML w formie łańcucha?
Wypróbowałem to z flagą akceptacji:
@RequestMapping(value = "/content/json/{ids}", method = RequestMethod.GET, headers = "Accept=application/json")

ale to nie działa. Otrzymuję następujący błąd:
org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.StackOverflowError

Mam nadzieję, że ktoś może mi pomóc.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli używasz Spring 3.1, możesz skorzystać z nowego elementu
makes
w adnotacji
@RequestMapping
, aby mieć pewność, że utworzysz XML lub JSON tak, jak chcesz, nawet w tę samą aplikację.
Napisałem o tym poście tutaj:
http://springinpractice.com/20 ... ebody
http://springinpractice.com/20 ... body/
/
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Whoa ... Kiedy pracujesz z wiosną, zakładasz, że ktoś inny napotkał ten sam problem. Możesz zresetować wszystkie generację serwera JSON, ponieważ wszystko, co musisz zrobić, to:
  • Dołącz do aplikacji pliki JAR Jackson JSON
  • Ustaw typ powrotu RequestMapping równy
    @responsebody (YourBjectType)

Wiosna automatycznie konwertuje Twój obiekt w JSON. Naprawdę. Działa jak magia.
Zadokuj dla
@ResponseBody
:

http://static.springsource.org ... body.
http://static.springsource.org ... ebody
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz użyć ContentNegotiatingViewResolver jak poniżej:
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="defaultContentType" value="application/json"/>
<property name="ignoreAcceptHeader" value="true"/>
<property name="favorPathExtension" value="true"/>
<property name="order" value="1"/>
<property name="mediaTypes">
<map>
<entry key="xml" value="application/xml"/>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="defaultViews">
<list>
<ref bean="xmlView"/>
<ref bean="jsonView"/>
</list>
</property>
</bean><bean id="jsonView"
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="contentType" value="application/json;charset=UTF-8"/>
<property name="disableCaching" value="false"/>
</bean><bean id="xmlView"
class="org.springframework.web.servlet.view.xml.MarshallingView">
<property name="contentType" value="application/xml;charset=UTF-8"/>
<constructor-arg>
<ref bean="xstreamMarshaller"/>
</constructor-arg>
</bean>
<bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
<property name="autodetectAnnotations" value="true"/>
<property name="annotatedClass" value="demo.domain.xml.XMLResponse"/>
<property name="supportedClasses" value="demo.domain.xml.XMLResponse"/>
</bean>

W swoim kontrolerze:
@RequestMapping(value = "/get/response.json", method = RequestMethod.GET)
public JSONResponse getJsonResponse(){
return responseService.getJsonResponse();
}
@RequestMapping(value = "/get/response.xml", method = RequestMethod.GET)
public XMLResponse getXmlResponse(){
return responseService.getXmlResponse();
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli ktoś używa bootka sprężyny, aby odpowiedzieć na XML, dodaj następującą zależność,
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>

W klasie modelu powracasz, dodaj @xmlolement .
@Entity
@Table(name = "customer")
@XmlRootElement
public class Customer {
//... fields and getters, setters
}

W swoim kontrolera dodaj
Produress = "Application/XML"
. Spowoduje to odpowiedź XML.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Napisałem tutaj metodę, która przyjmuje XML jako parametr żądania z wyświetlania żądania adresu URL
Tutaj wysyłam XML do mojego adresu URL "Baseurl/Użytkownik/Creastuser/"
public class UserController {
@RequestMapping(value = "createuser/" ,
method=RequestMethod.POST, consumes= "application/xml")
@ResponseBody
ResponseEntity<String> createUser(@RequestBody String requestBody ) { String r = "<ID>10</ID>";// Put whatever response u want to return to requester return new ResponseEntity<String>( "Handled application/xml request. Request body was: "
+ r,
new HttpHeaders(),
HttpStatus.OK);
}
}

Przetestowałem go za pomocą plakatu Chrome, gdzie można wysłać dowolny XML w treści zawartości, na przykład:
"<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <userEntity><id>3</id><firstName>saurabh</firstName><lastName>shri</lastName><password>pass</password><userName>test@test.com</userName></userEntity>"

Ten kod XML zostanie przechwycony przez moją metodę createUser i zapisany w ciągu requestBody, którego mogę dalej używać
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Najprostszym sposobem jest uzyskanie odpowiedzi JSON byłby:
Korzystając ze Springa 3.1, możesz wykonać następujące czynności
  • W swoim pliku pom.xml (mam nadzieję, że używasz projektu maven) dodaj zależność maven dla jackson-mapper ( http://mvnrepository. com/artifact/org.codehaus.jackson/jackson-mapper-asl/1.9.13 http://mvnrepository.com/artif ... .9.13 )
  • Zmodyfikuj swój kod w następujący sposób i przetestuj punkt końcowy na listonoszu:
    @RequestMapping(value = "/content/json/{ids}", method = RequestMethod.GET)public @ResponseBody String getContentByIdsAsJSON(@PathVariable("ids") String ids){ String content = ""; StringBuilder builder = new StringBuilder(); List<String> list = this.contentService.findContentByListingIdAsJSON(ids); if (list.isEmpty()){ content = "<xml version=\"1.0\" encoding=\"UTF-8\"><error>no data found</error>"; return content; } for (String json : list){ builder.append(json + "\n"); } content = builder.toString(); return content;}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Po długich badaniach uważam, że mam dobre rozwiązanie: bardzo proste, domyślnie używa Jackson do pracy z JSON, ta biblioteka przychodzi
W Spring-Boot-Starter-Web


ale rozszerzenie Jackson Xml nie jest dostarczane domyślnie, wszystko, co musisz zrobić, to zaimportować zależność jackson-dataformat-xml do pliku build.gradle lub pom.xml,


a teraz możesz przeplatać json lub xml na przykład z takim kodem:
@PostMapping(value = "/personjson")
public ResponseEntity<?> getJsonPerson (@RequestBody Person person) {
return ResponseEntity.accepted().contentType(MediaType.APPLICATION_JSON)
.body(person);
}@PostMapping(value = "/personxml")
public ResponseEntity<?> getXmlPerson (@RequestBody Person person) {
return ResponseEntity.accepted().contentType(MediaType.APPLICATION_XML)
.body(person);
}

Tam, gdzie osobą jest Bob (jest tylko tag @Component), podczas gdy blokowanie jest równe, oba kody są równe, tylko MediaType jest inny i działa !!, nierzadko dodaje się "produkuje" i "konsumuje" atrybuty do tagu dopasowania, ponieważ Spring domyślnie może zużywać zarówno Json, jak i Xml, zrobiłem przykład wysyłania i odbierania Json.


XML i wysyłanie XML dostaje JSON,
tylko musisz określić w swoim listonoszu lub curl, kiedy wysyłasz żądanie, prawidłowy nagłówek treści, którą wysyłasz, to application/json lub application/xml.


Uwaga: To tylko sposób na to, Jaxb i XMLRolement, istnieje inny sposób na to zrobić.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się