Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Attachment в ответах от веб-сервиса.


Автор: RWIII 5.11.2012, 20:15
Привет. 
Есть веб-сервис - ejb stateless session bean. У него есть один веб-метод - getConfig. Мне нужно, чтобы в ответе веб-сервиса прикреплялся attachment. 

Вот, код сервиса: 

Код

import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.GZIPOutputStream;

import javax.activation.DataHandler;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebParam.Mode;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;
import javax.xml.bind.DatatypeConverter;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

@SOAPBinding(
        parameterStyle = ParameterStyle.WRAPPED, 
        style = Style.DOCUMENT, 
        use = Use.LITERAL)
@Stateless(
        description = "stateless description", 
        mappedName = "EJB-mapped-service", 
        name = "EJB-WS-MyWeb")
@WebService(
        name = "MyWeb", 
        portName = "MyWebPort", 
        serviceName = "services")
public class MyService implements MyServiceRemote, MyServiceLocal {

    @Resource(
            description = "web service context", 
            name = "webServiceContext")
    private WebServiceContext webServiceContext;

    @WebMethod(
            action = "getConfig", 
            operationName = "getConfig")
    public String getConfig(
            @WebParam(
                    mode = Mode.IN, 
                    name = "name", 
                    partName = "PartName") 
            String name)
            throws Exception {

        String fileContent = "aaaabbbbbcccccdddddeeeee";

        MessageContext mc = webServiceContext.getMessageContext();
        Map<String, DataHandler> attachments = new HashMap<String, DataHandler>();
        
        DataHandler dataHandler = new DataHandler(packXmlData(fileContent), "application/gzip");
        attachments.put("RETURN_FROM_SERVER", dataHandler);
        
        if (mc.containsKey(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS)) {
            mc.remove(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS);
        }
        
        mc.put(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS, attachments);
        
        return fileContent;
    }

    public static Object packXmlData(String source) {

        ByteArrayOutputStream buffer = new ByteArrayOutputStream(source.length() * 2);
        try {
            GZIPOutputStream out = new GZIPOutputStream(buffer);
            out.write(source.getBytes());
            out.flush();
            out.close();
        } catch (Exception e) {
            return new ByteArrayOutputStream();
        }
        
        String encode = DatatypeConverter.printBase64Binary(buffer.toByteArray());

        return encode;
    }
}


Интерфейсы:

Код

import javax.ejb.Remote;

@Remote
public interface MyServiceRemote {
    String getConfig(String name) throws Exception;
}


Код

import javax.ejb.Local;

@Local
public interface MyServiceLocal {
    String getConfig(String name) throws Exception;
}




Но через soapUI видно, что нет никаких вложений.
user posted image

Исходный код примера прикреплен.

Пожалуйста, помогите решить данную проблему.
Спасибо.

Автор: priam220 6.11.2012, 13:44
Цитата

webServiceContext

На сколько я понимаю, это статическая часть соединения. Т.е. WebServiceContext создается на стороне клиента при создании порта, а не при каждом обращении к методу. 
Хотя я могу запросто ошибаться. 
В таком случае, если надо передавать динамические данные, то вместо String надо передавать сложный объект.

Автор: RWIII 6.11.2012, 14:34
WebServiceContext инжектируется контейнером.
В дебаге видно, что необходимая инициализация есть. Даже более того, при выходе из метода я вижу, что добавленые мною attachment"ы есть в контексте WebServiceContext.
Но до клиента ничего не доходит. Проверял уже и в soapUI, и просто в клиенте :(

Автор: priam220 6.11.2012, 15:13
а что используете в качестве сервера? Там в Jboss какие то баги.

И WebServiceContext webServiceContext не должен быть private.

http://ttps://community.jboss.org/message/336899

Автор: RWIII 6.11.2012, 15:36
от jboss отказались)
сейчас сидим на GlassFish Server Open Source Edition 3.0.1 (Java EE 6) 
а EJB используется версии 3.0.

сделал public"ом, но эффекта не дало..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)