1

Spring MVC REST サービスおよびクライアント。エラーに対処するためのより良い方法を探しています!

クライアントにエラー メッセージまたはステータス コードを返したい場合がありますが、どうすればよいかわかりません。Spring REST サービスとクライアントのエラーとエラー メッセージを処理するより良い方法を見つける方法を教えてください。

これが私のサービスコードです:

@RequestMapping(value = "/{name}", method = RequestMethod.GET)
@ResponseBody
public User getName(@PathVariable String name, ModelMap model) throws ResourceNotFoundException
{

    logger.debug("I am in the controller and got user name: " + name);

    /*

        Simulate a successful lookup for 2 users, this is where your real lookup code would go

     */

    if ("user2".equals(name))
    {
        return new User("User2 Real Name", name);
    }

    if ("user1".equals(name))
    {
        return new User("User1 Real Name", name);
    }

    throw new ResourceNotFoundException("User Is Not Found");
}


 @ExceptionHandler(ResourceNotFoundException.class)
 public ModelAndView handleResourceNotFoundException(ResourceNotFoundException ex)
{
    logger.warn("user requested a resource which didn't exist", ex);
    return new ModelAndView( jsonView, "error", "user requested a resource which didn't exist");
}

クライアントのコードは次のとおりです。

Map<String, String> vars = new HashMap<String, String>();
vars.put("name", "user1");


/**
 *
 * Doing the REST call and then displaying the data/user object
 *
 */
RestTemplate restTemplate = new RestTemplate(commons);
restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());

try
{
    User jsonreturn = restTemplate.getForObject("http://" + mRESTServer.getHost() + ":8080/json/{name}", User.class, vars);
    LOGGER.debug("return object:  " + jsonreturn.toString());
}
catch(Exception e)
{
    LOGGER.error("error:  " + e.toString());
}

ユーザーが見つからず、さらにクライアントコードでこのエラーが発生した場合に、ステータスコードとメッセージを返す方法を見つけたい:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field "error"
4

2 に答える 2

2

私はこのアプローチ(JSON/Jackson 2を使用)を使用して成功しました:

class ErrorHolder {
    public String errorMessage;
    public ErrorHolder(String errorMessage) {
        this.errorMessage = errorMessage;
    }
}

@ExceptionHandler
public @ResponseBody ResponseEntity<ErrorHolder> handle(ResourceNotFoundException e) {
    logger.warn("Teh resource was not found", e);
    return new ResponseEntity<ErrorHolder>(new ErrorHolder("Uh oh"), HttpStatus.NOT_FOUND);
}

少なくとも Spring 3.2.x で動作します。

于 2013-06-07T21:09:57.690 に答える
0

主なポイントは、正しい返されたオブジェクトと間違ったオブジェクトを処理する方法だと思います。あなたのクライアントで:

try
{
    User jsonreturn = restTemplate.getForObject("http://" + mRESTServer.getHost() + ":8080/json/{name}", User.class, vars);
    LOGGER.debug("return object:  " + jsonreturn.toString());
}
catch(Exception e)
{
    LOGGER.error("error:  " + e.toString());
}

エラーが発生した場合、返されるオブジェクトは User ではないため、messageConverter はうまく機能しません。</p>

私の解決策は次のとおりです。サーバー側では、response.setStatus(HttpServletResponse.SC_BAD_REQUEST);を使用します。 その場合、クライアントは messageConverter を使用せず、例外として HttpClientErrorException または HttpServerErrorException をスローします。すべてに応答本文があるため、それらの e.getResponseBodyAsString() を呼び出してエラー メッセージを取得できます。

于 2013-12-02T06:09:22.033 に答える