2017-03-03 2 views
0

Ich habe ein Problem mit eckigen 2 http Post JSON mit mehreren Attributen zu Spring MVC mit @RequestParam, aber es kann nicht an mein Objekt binden, und ich versuche zu suchen und herum Es gibt eine andere Möglichkeit, @ModelAttribute zu verwenden, aber immer noch das gleiche Ergebnis zu erhalten. Unten ist mein Beispielcode:Angular 2 http Beitrag zu Spring MVC (Rest)

Angular 2 (http):

this.http.post('api/codetype-create', JSON.stringify(params), { headers: new Headers({ 'Content-Type': 'application/json' }) }) 
    .toPromise() 
    .then(res => res.json().data) 
    .catch(this.handleError); 

Und die JSON ist wie folgt aussieht:

{ 
    "test": { 
    "ctmCode": "11", 
    "ctmMaxLevel": 11, 
    "ctmDesc": "test" 
    }, 
    "test2": { 
    "param1": "abc", 
    "param2": "abc", 
    "param3": "abc" 
    } 
} 

Im Grunde bin ich versucht abrufen "test" und binden mein Objekt im Frühjahr MVC, aber es zeigt Null. Unten ist meine Feder Controller:

@RestController 
@RequestMapping("/api") 
public class AppController { 
    @Autowired 
    Mdc_CodeTypeService mdcCodeTypeService; 

    @Transactional 
    @RequestMapping(value = {"/codetype-create"}, method = RequestMethod.POST) 
    public ResponseEntity<String> postCreateCodeType(ModelMap model, HttpServletRequest request, 
       @RequestParam(value="test",required=false) Mdc_CodeType test) { 
    try { 
     mdcCodeTypeService.createMdcCodeType(test); 
    } catch (Exception ex) { 
     return new ResponseEntity< String>("failed", HttpStatus.BAD_REQUEST); 
    } 
    return new ResponseEntity<String>("Success", HttpStatus.CREATED); 
    } 
} 

Update: Es ist eine alternative Methode von Leon vorgeschlagen unter Verwendung von Objekt Wrapper mit dem JSON abzuzubilden. Ich nehme es als meine zweite Option, aber mein Ziel ist nur Zuordnung "test" -Attribut zu meinem Mdc_CodeType-Objekt mit Spring Annotation, ist das möglich?

Antwort

1

Sie müssen den Hauptteil der Anforderung an eine Variable mit @RequestBody binden. Sie benötigen ein Objekt, um den gesamten Körper zu erfassen.

@RequestMapping(value = {"/codetype-create"}, method = RequestMethod.POST) 
public ResponseEntity<String> postCreateCodeType(ModelMap model, HttpServletRequest request, @RequestBody CompleteRequestBody body) { 
    try { 
    mdcCodeTypeService.createMdcCodeType(body.getTest()); 
    } catch (Exception ex) { 
    return new ResponseEntity< String>("failed", HttpStatus.BAD_REQUEST); 
    } 
    return new ResponseEntity<String>("Success", HttpStatus.CREATED); 
} 

CompleteRequestBody ist eine hypothetische Klasse, die alles in der Anforderung kapselt.

+0

Vielen Dank für Ihre Antwort, aber mit diesem Ansatz muss ich möglicherweise viele Klassen erstellen, um neue Post-Daten zu verarbeiten, oder ist dies der einzige Weg? –

+0

Java ist eine stark typisierte Sprache und ich würde persönlich empfehlen, für jede Art von Anfrage eine konkrete Klasse zu haben; Denken Sie jedoch daran, dass Sie immer noch Generika und Polymorphismen verwenden können, um einen Großteil der Komplexität zu abstrahieren. Alternativ können Sie den Objekttyp eine HashMap machen und so auf die Daten zugreifen, aber Sie verlieren alle Kompilierungsüberprüfungen Ihrer Daten. – Leon

+0

Vielen Dank für Ihren Vorschlag. Die Verwendung von Java-Klasse ist eine zweite Option, aber ich würde es gerne wissen Wie wir einen Teil von JSON mit Spring Annotation –