2016-10-10 3 views
1

ジャージーのドキュメントはhow to inject HttpSession on resourcesの例を示しています。 "Content-Type:application/x-www-form-urlencoded"のリクエストで送信されたフォームパラメータをどのように注入する必要がありますか?私はこれらがparameters on methods, and do not seem to be annotatedとして渡されているのを見て、ここにいくつかの奇妙なことがあると信じさせてくれますか?注入されたマルチバリューマップ(アプリケーション/ x-www-form-urlencoded)を持つ注入プロバイダ

JerseyHttpServletRequestWrapperは自分のクラスの一つである私は現在、次のように実装されて働いている(ナイーブ)工場、:

import org.glassfish.hk2.api.Factory; 

import javax.inject.Inject; 
import javax.servlet.http.HttpServletRequest; 
import javax.ws.rs.core.MultivaluedMap; 

public class JerseyHttpServletRequestWrapperFactory implements Factory<JerseyHttpServletRequestWrapper> { 
    private final HttpServletRequest request; 
    private final MultivaluedMap<String, String> formParams; 

    @Inject 
    public JerseyHttpServletRequestWrapperFactory(HttpServletRequest request, MultivaluedMap<String, String> formParams) { 
     this.request = request; 
     this.formParams = formParams; 
    } 

    @Override 
    public JerseyHttpServletRequestWrapper provide() { 
     return new JerseyHttpServletRequestWrapper(request, formParams); 
    } 

    @Override 
    public void dispose(JerseyHttpServletRequestWrapper jerseyHttpServletRequestWrapper) { 
    } 
} 

私は、エンティティプロバイダがインスタンスに注入する必要があることを、ここで考えています実際にリクエストとともに送信されたエンティティがあるかどうかを確認できます。直接でMultivaluedMapエラーを注入しようとしている:あなたは

@POST 
public Response post(MultivaluedMap<String, String> params) {} 

この方法を行うと

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=MultivaluedMap<String,String>,parent=JerseyHttpServletRequestWrapperFactory,qualifiers={},position=1,optional=false,self=false,unqualified=null,2067821943) 
+0

これは、あなたがSOで尋ねるべき質問の種類ではありません。これまでに行ったことを示す必要があります。コードを教えてください。 –

答えて

2

は、パラメータの注入は、通常のフィールド/コンストラクタ・インジェクションとは異なる方法で処理されます。したがって、MultivaluedMapをフィールドに注入することはできません。

何ができるのですか?ContainerRequestを注入し、本文を読みます。 POSTリクエストであり、Content-Typeがapplication/x-www-form-urlencodedであることを確認する必要があります。そうしないと、エンティティを読み込もうとすると例外が発生する可能性があります。

@Inject 
ContainerRequest request; 

if (request.getMethod().toUpperCase().equals("POST") 
    && request.getMediaType().equals(MediaType.APPLICATION_FORM_URLENCODED_TYPE)) { 
    request.bufferEntity(); 
    Form form = request.readEntity(Form.class); 
    MultivaluedMap<String, String> params = form.asMap(); 
} 
関連する問題