Как создать мыльный клиент CRUD с библиотекой feign-soap? - PullRequest
1 голос
/ 29 июня 2019

Следующий код - мой мыльный веб-сервис с операциями CRUD:

UserService.java

package com.gpcoder.ws;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface UserService {

    @WebMethod
    int insert(User user);

    @WebMethod
    boolean update(User user);

    @WebMethod
    boolean delete(int id);

    @WebMethod
    User get(int id);

    @WebMethod
    User[] getAll();
}

UserServiceImpl.java

package com.gpcoder.ws;

import java.util.HashMap;
import java.util.Map;

import javax.jws.WebService;

@WebService(endpointInterface = "com.gpcoder.ws.UserService")
public class UserServiceImpl implements UserService {

    private static final Map<Integer, User> USERS = new HashMap<>();

    @Override
    public int insert(User user) {
        Integer id = generateUniqueId();
        user.setId(id);
        USERS.put(id, user);
        return id;
    }

    private int generateUniqueId() {
        return USERS.keySet().stream().max((x1, x2) -> x1 - x2).orElse(0) + 1;
    }

    @Override
    public boolean update(User user) {
        return USERS.put(user.getId(), user) != null;
    }

    @Override
    public boolean delete(int id) {
        return USERS.remove(id) != null;
    }

    @Override
    public User get(int id) {
        return USERS.getOrDefault(id, new User());
    }

    @Override
    public User[] getAll() {
        return USERS.values().toArray(new User[0]);
    }
}

SoapPublisher.java

package com.gpcoder.ws;

import javax.xml.ws.Endpoint;

public class SoapPublisher {

    public static final String WS_URL = "http://localhost:8080/ws/users";

    public static void main(String[] args) {
        Endpoint.publish(WS_URL, new UserServiceImpl());
        System.out.println("Server is published!");
    }
}

Я бы хотел использовать библиотеку feign-soap для вызова API мыла. Я попытался реализовать это, следуя документу feign-soap . Вот мой код на стороне клиента:

pom.xml

<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-soap -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-soap</artifactId>
    <version>10.2.3</version>
</dependency>

UserService.java

import java.util.ArrayList;
import java.util.List;

import com.gpcoder.model.User;

import feign.Headers;
import feign.RequestLine;

@Headers({ "Content-Type: text/xml" })
public interface UserService {

    @RequestLine("POST /get")
    @Headers({ "SOAPAction: get" })
    String getUser(int id);

    @RequestLine("POST /insert")
    @Headers({ "SOAPAction: insert" })
    String createUser(User user);

    @RequestLine("POST /update")
    @Headers({ "SOAPAction: update" })
    String updateUser(User user);

    @RequestLine("POST /delete")
    @Headers({ "SOAPAction: delete" })
    String deleteUser(int id);

    default List<String> getUsers(int... ids) {
        List<String> orders = new ArrayList<>();
        for (int id : ids) {
            orders.add(this.getUser(id));
        }
        return orders;
    }
}

FeignClientCreator.java

import feign.Feign;
import feign.jaxb.JAXBContextFactory;
import feign.soap.SOAPDecoder;
import feign.soap.SOAPEncoder;
import feign.soap.SOAPErrorDecoder;

public class FeignClientCreator {

    public static final String BASE_URL = "http://localhost:8080/ws/users";

    public static <T> T getService(Class<T> clazz) {

        JAXBContextFactory jaxbFactory = new JAXBContextFactory.Builder()
                 .withMarshallerJAXBEncoding("UTF-8")
                 .withMarshallerSchemaLocation("http://apihost http://apihost/schema.xsd")
                 .build();

        return Feign.builder()
                 .encoder(new SOAPEncoder(jaxbFactory))
                 .decoder(new SOAPDecoder(jaxbFactory))
                 .errorDecoder(new SOAPErrorDecoder())
                 .target(clazz, BASE_URL);
    }
}

FeignClientExample.java

import java.io.IOException;

import com.gpcoder.helper.FeignClientCreator;
import com.gpcoder.model.User;
import com.gpcoder.service.UserService;

public class FeignClientExample {

    private static UserService userService;

    public static void main(String[] args) throws IOException {
        userService = FeignClientCreator.getService(UserService.class);

        createUser();
    }

    private static void createUser() throws IOException {
        User user1 = new User();
        user1.setId(1);
        user1.setUsername("gpcoder.com");

        System.out.println("createUser1: " + userService.createUser(user1));
    }
}

Я не знаю, где мой код неверен. Когда я запускаю свою программу, она показывает журнал ошибок:

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Cannot find dispatch method for {}user
    at feign.soap.SOAPErrorDecoder.decode(SOAPErrorDecoder.java:68)
    at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:149)
    at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:78)
    at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103)
    at com.sun.proxy.$Proxy3.createUser(Unknown Source)
    at com.gpcoder.FeignClientExample.createUser(FeignClientExample.java:32)
    at com.gpcoder.FeignClientExample.main(FeignClientExample.java:16)

Кто-нибудь уже работал с этой библиотекой или у нее есть какие-то документы, пожалуйста, дайте мне немного информации?

...