2016-07-15 5 views
0

Ich versuche, fehlende JSON-Daten in einer POST-Anfrage zu behandeln. Mein Controller-KlassePOST REST korrigieren Fehlerstatus Fehlercode mit Spring Ausnahme

@Controller 
@RequestMapping("/testMetrics") 

public class TestMetricsEndPoint extends StatusEndpointHandler implements RestEndPoint<TestMetrics,String> { 

@Autowired 
private ObjectMapper mapper; 

@Autowired 
private TestMetricsService testMetricsService; 

@Override 
public Status get(String id) { 
    // TODO Auto-generated method stub 
    return null; 
} 


@Override 
@RequestMapping(method = RequestMethod.POST,consumes = "application/json", produces = "application/json") 
public @ResponseBody Status create(@RequestBody TestMetrics core, BindingResult bindingResult) { 
    try { 
    if(bindingResult.hasErrors()){ 
     throw new InvalidRequestException("Add failed, Please try again ", bindingResult); 
    } 
    if((core.getGroupName()==""||core.getGroupName()==null)&&(core.getTestName()==null||core.getTestName()=="")){ 

      throw new MissingParametersException(HttpStatus.BAD_REQUEST.value(),"Please provide all necessary parameters"); 
     } 
    TestMetrics dataObject = testMetricsService.create(core); 
    return response(HttpStatus.CREATED.value(),dataObject); 
    }catch (MissingParametersException e) { 
     return    response(HttpStatus.BAD_REQUEST.value(),e.getLocalizedMessage()); 
    } 

} 

Erweiterte Klasse:

public class StatusEndpointHandler { 


public Status response(Integer statusCode,Object data){ 
    Status status = new Status(); 
    status.setData(data); 
    status.setStatus(statusCode); 



    return status; 
} 

} 

implementierte Schnittstelle:

public interface RestEndPoint<T extends SynRestBaseJSON, ID extends Serializable> { 

Status get(ID id); 

Status create(T entity, BindingResult bindingResult);} 

Ergebnis: enter image description here

Schauen Sie bitte auf den markierten Teil Also, als ich versuchte, das Ergebnis über POSTMAN zu testen, bekomme ich den Status als 200 OK. Ich habe keine Ahnung, dass es heiß ist, es zu lösen. Bitte hilf mir bei dieser Situation. Wie bekomme ich den richtigen Statuscode?

Antwort

1

Sie sollten @ResponseBody-ResponseEntity Ihre Rückgabetyp ändern, die Sie Header manipulieren können, um den Status dafür gesetzt, dies ist ein Ausschnitt aus der Dokumentation ist

@RequestMapping("/handle") 
public ResponseEntity<String> handle() { 
    URI location = ...; 
    HttpHeaders responseHeaders = new HttpHeaders(); 
    responseHeaders.setLocation(location); 
    responseHeaders.set("MyResponseHeader", "MyValue"); 
    return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED); 
} 
+0

Sorry, mir ist nicht klar, was Sie gesagt haben. Ich habe verstanden, dass ich @ResponseEntity verwenden muss. Aber ich habe nicht verstanden, wie man es benutzt. – krish

+0

Ich habe es fast als richtigen Weg hingestellt. Sie sollten genügend Ressourcen finden, um zu verstehen, warum und wie Sie es verwenden. Im Grunde ist es die eingebaute Klasse, die der Logik Ihres 'StatusEndpointHandler' entspricht. –

0

Das Problem ist, mit Ihrem Code die Zeichenfolge übergeben Vergleich zu Strings vergleichen Sie haben equals zu verwenden, von Postman auch Sie vorbei leer Testnamen und Gruppennamen

if ((core.getGroupName() == "" || core.getGroupName() == null) && (core.getTestName() == null || core.getTestName() == "")) { 
    } 

so Ihren Code unter

ändern
if ((core.getGroupName() == null || core.getGroupName().trim().isEmpty()) && (core.getTestName() == null || core.getTestName().trim().isEmpty())) { 

    } 

schreiben auch eine ExceptionHandler für dieses

@ExceptionHandler({ MissingParametersException.class }) 
public ModelAndView handleException(ServiceException ex, HttpServletResponse response) { 
    response.setStatus(HttpStatus.BAD_REQUEST.value()); 
    ModelMap model = new ModelMap(); 
    model.addAttribute("message", ex.getMessage()); 
    return new ModelAndView("error", model); 
} 

Sie auch die Validierung beschränkt in Entity-Klasse Validierung api, in diesem Fall definieren können Sie @Valid auf die Anfrage Modellobjekt

@Entity 
class TestMetrics { 

    @Id 
    Long id; 

    @NotNull 
    @NotEmpty 
    @Column 
    String groupName; 

    @NotNull 
    @NotEmpty 
    @Column 
    String testName; 

    // Getters and Setters 

} 
hinzufügen müssen
+0

Ich habe Ihren Code ausprobiert, aber das Ergebnis ist immer noch dasselbe. – krish

+0

haben Sie 'testName' und' groupName' eingegeben? es sollte nicht leer oder null gemäß der Validierungslogik sein – Saravana

+0

Ja. Ich trat bot von ihnen – krish

1

Versuchen Sie in Ihrer Catch-Anweisung, den Status über

response.setStatus(HttpServletResponse.SC_BAD_REQUEST ); 
festzulegen

Source

Verwandte Themen