2016-10-29 6 views
0

私はspringとcxfを使用してJavaレストWebサービスを持っていますが、私のWS層からGrails/Groovyフロントエンドにエラーメッセージを伝えようとしています。私のフロントエンドは、Webサービスのクライアントスプリングを参照してWebサービスを呼び出します。Cxfマッパーまたはインターセプタが元のエラーメッセージにアクセスできない

私は、呼び出される例外マッパーを持っています、そして、REST要求をするとき、私はそこにエラーメッセージを取得しますが、プロキシを使用すると仮定した私のフロントエンドを使用するとき、エラーメッセージは利用できません。

私はまた、呼び出されるインターセプタを使用しようとしましたが、 message.getContent(Exception.class)を呼び出すと、 がnullを返します。

デバッガを使用して例外をトレースすると、ServiceInvokerInterceptorが呼び出されたときにメッセージが失われる可能性があります。

私はこれをcxf 2.4で動作させましたが、3.0にアップグレードした時点で機能が削除されていましたが、今戻してみると、何か不足しているのか、cxfが変更されたのか分かりません。

私はクライアントに正しく行うことができる唯一の事は、 ResponseExceptionMapperをトリガーすることですが、私は応答objetから元の例外を取得する方法がありません。

ここには、フロントエンドからの典型的なスタックトレースがあります。

HTTP 500 Internal Server Error. Stacktrace follows: 
Message: HTTP 500 Internal Server Error 
    Line | Method 
->> 14 | fromResponse  in com.company.common.web.RestResponseExceptionMapper 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|  9 | fromResponse  in  '' 
| 302 | checkResponse . . . in org.apache.cxf.jaxrs.client.ClientProxyImpl 
| 725 | handleResponse  in  '' 
| 683 | doChainedInvocation in  '' 
| 224 | invoke    in  '' 

私はこの同じ問題に関連する3つの他の質問が書かれているし、私はこれを理解しようとしている私の髪を引っ張ってきました。

+0

だサーバーのExceptionMapperのコードとサービスを呼び出して、あなたのクライアントの作品を投稿してください。クライアント側でResponseExceptionMapperを使用していますか? – pedrofb

答えて

0

お試しExceptionMapperクラスです。 RESTサービスで作業しているのなら、完璧なソリューションです。

はここでサンプル

import java.io.PrintWriter; 
import java.io.StringWriter; 

import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.ResponseBuilder; 
import javax.ws.rs.ext.ExceptionMapper; 

import org.springframework.http.MediaType; 
import org.springframework.stereotype.Component; 

@Component 
public class RestExceptionMapper implements ExceptionMapper<Throwable> { 
    public final String exceptionMessagePrefix = "Exception at server."; 

    @Override 
    public Response toResponse(Throwable exception) { 
     String stackTrace = getStackTrace(exception); 

     ResponseBuilder builder = Response.status(Response.Status.INTERNAL_SERVER_ERROR); 
     builder.entity(stackTrace); 
     builder.header("Content-Type", MediaType.TEXT_PLAIN_VALUE); 

     return builder.build(); 
    } 

    public String getStackTrace(Throwable ex) { 
     StringWriter stringWriter = new StringWriter(); 
     PrintWriter out = new PrintWriter(stringWriter); 

     ex.printStackTrace(out);//Only if you want it to output to console 

     stringWriter.close(); 
     out.close(); 

     return stringWriter.toString(); 
    } 
} 
+0

私はExceptionMappersを使用しようとしました。私がレストサービスに郵便配達人のリクエストをすると、ジェネリック500のエラーの代わりに実際のエラーが出ます。しかし、UIはエラーを取得していないようですが、mapperはヒットしましたが、何らかの理由でクライアントとしてcxfを使用しています。 (私のクライアントはバックエンドWSのクライアントファイルを参照しています)エラーは消え去ってしまいます – iamdro

+0

私は言い換えれば、例外マッパーを使用していますが、例外が存在していてもaxrsのクライアント - ヒット、私はまだそれを表示しない(ちょうど一般的な500のエラー) – iamdro

関連する問題