2013-11-15 4 views
5

Ich habe Schwierigkeiten, JSON-Eingaben in meinen Spring Restful Webservice zu akzeptieren. Grundsätzlich ist es meine Absicht, ein JSON zu akzeptieren und eine Zip-Datei zurückzugeben. Aber ich bin nicht in der Lage, den ersten Schritt selbst zu gehen. Folgende ist die Controller-CodeWie akzeptiere ich JSON-Eingaben im Spring Restful Webservice?

@Controller 
@RequestMapping(value = "/request") 
public class PasskitController { 

@Autowired 
@Qualifier("PassManager") 
private PassManager pm; 

/*headers = { "Accept:application/json" }, 
consumes = MediaType.APPLICATION_JSON_VALUE,*/ 

@RequestMapping(value = "/createPass", method = RequestMethod.POST, 
     consumes = MediaType.APPLICATION_JSON_VALUE, 
     produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) 
public @ResponseBody ByteArrayOutputStream createGiftPass(
     @RequestBody PassGenerationRequest request) throws IOException { 
    System.out.println("in createGiftPass() method"); 
    String success = "Success"; 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    baos.write(success.getBytes()); 
    return baos; 
} 

@RequestMapping(value = "/test", method = RequestMethod.GET, 
     produces = MediaType.TEXT_PLAIN_VALUE) 
public @ResponseBody 
String test() throws IOException { 
    System.out.println("in test() method"); 
    return "Success"; 
} 
} 

I des Eingangs JSON in folgenden pojo abbilden müssen PassGenerationRequest

@JsonAutoDetect 
public class PassGenerationRequest { 

private String serialNumber; 
private String upc; 
private String campaign; 
private String merchant; 

public String getSerialNumber() { 
    return serialNumber; 
} 

public void setSerialNumber(String serialNumber) { 
    this.serialNumber = serialNumber; 
} 

public String getUpc() { 
    return upc; 
} 

public void setUpc(String upc) { 
    this.upc = upc; 
} 

public String getCampaign() { 
    return campaign; 
} 

public void setCampaign(String campaign) { 
    this.campaign = campaign; 
} 

public String getMerchant() { 
    return merchant; 
} 

public void setMerchant(String merchant) { 
    this.merchant = merchant; 
} 
} 

folgend die verschiedenen HttpMessageConverters konfiguriert in feder servlet.xml sind

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonMessageConverter" /> 
      <ref bean="byteArrayMessageConverter"/> 
      <ref bean="stringMessageConverter"/> 
     </list> 
    </property> 

</bean> 

<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" > 
    <property name="supportedMediaTypes" value="application/json" /> 
</bean> 

<bean id="byteArrayMessageConverter" 
    class="org.springframework.http.converter.ByteArrayHttpMessageConverter" > 
    <property name="supportedMediaTypes" value="application/octet-stream" /> 
</bean> 

<bean id="stringMessageConverter" 
    class="org.springframework.http.converter.StringHttpMessageConverter" > 
    <property name="supportedMediaTypes" value="text/plain" /> 
</bean> 

Zur Zeit bekomme ich Inhaltstyp 'text/plain; charset = UTF-8 'wird nicht unterstützt Ausnahme.

Wenn ich hinzufügen, die header = { "Accept: application/json"} dann bekomme ich sagen Ausnahme kein Handler für die Anforderung "Anfrage/createPass"

jemand gefunden Kann mir bitte über aushelfen Hier?

Danke.

+0

Wie sieht Ihre Anfrage aussehen? –

+0

Ich habe die Postman App benutzt um meine Anfrage zu posten. – user2985202

Antwort

1

Überprüfen Sie, ob Ihre Anfrage auf application/json lautet.

Accept beschreibt den Medientyp, den Sie in der Antwort sehen möchten. Sie haben dies für binäre Daten festgelegt. Wenn Sie stattdessen application/json angeben, sieht Spring keine Übereinstimmung.

+0

Ich benutzte Postman, eine Chrome-App, um meine Anfragen zu posten. Ich setze den Inhaltstyp als JSON, aber ich bekomme das gleiche Problem. Ich habe auch versucht, über CURL zu posten. Folgendes ist meine CURL-Anfrage 'curl -i -H" Inhaltstyp: application/json "-X POST -d '{" Seriennummer ":" 1234 "," upc ":" 12345 "," Kampagne ":" 155950 " , "Händler": "ASDA"} 'http: // localhost: 8080/passkit-service-app-1.0/passkit/request/createPass' – user2985202

+0

Auch wenn ich die Header-Information als 'headers = {" Accept: application/octet-stream "}' was ich glaube, ist anwendbar, wenn ich ByteArrayOutputStream zurückgebe, gibt es mir HTTP 404, das ist keine gefundene Ressource – user2985202

+0

Was ist der Kontext für Ihre Webanwendung? Zum Beispiel ist es vielleicht "passkit" und die URL sollte "http: // localhost: 8080/passkit/request/createPass" – Vidya

1

Stellen Sie sicher, Jackson Bibliothek sind in Classpath Nachrichtenumformer MappingJacksonHttpMessageConverter ist für alte Jackson lib vor rel 2 nach rel 2 Sie MappingJackson2HttpMessageConverter hinzufügen müssen, Auch kann u Annotation Methodenhandler mit einfachen „“ und mit jackson lib entfernen in Klassenpfad, wird automatisch der gewünschte Nachrichtenkonverter ausgewählt.

0

Verwendung dieses

<bean 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonMessageConverter" /> 
     </list> 
    </property> 
</bean> 
Verwandte Themen