Saltar al contenido

Interfaz de controlador anotado Spring MVC con @PathVariable

Solución:

Aparentemente, cuando un patrón de solicitud se asigna a un método a través del @RequestMapping anotación, se asigna a la implementación del método concreto. Entonces, una solicitud que coincida con la declaración invocará GoalServiceImpl.removeGoal() directamente en lugar del método que originalmente declaró el @RequestMapping es decir GoalService.removeGoal().

Desde una anotación en una interfaz, método de interfaz o parámetro de método de interfaz no se transfiere a la implementación, no hay forma de que Spring MVC reconozca esto como un @PathVariable a menos que la clase de implementación lo declare explícitamente. Sin él, cualquier consejo de AOP que se dirija @PathVariable los parámetros no se ejecutarán.

La característica de definir todos los enlaces en la interfaz se implementó recientemente en Spring 5.1.5.

Consulte este problema: https://github.com/spring-projects/spring-framework/issues/15682 – fue una lucha 🙂

Ahora realmente puedes hacer:

@RequestMapping("/random")
public interface RandomDataController {

    @RequestMapping(value = "/{type}", method = RequestMethod.GET)
    @ResponseBody
    RandomData getRandomData(
            @PathVariable(value = "type") RandomDataType type, @RequestParam(value = "size", required = false, defaultValue = "10") int size);
}
@Controller
public class RandomDataImpl implements RandomDataController {

    @Autowired
    private RandomGenerator randomGenerator;

    @Override
    public RandomData getPathParamRandomData(RandomDataType type, int size) {
        return randomGenerator.generateRandomData(type, size);
    }
}

Incluso puede usar esta biblioteca: https://github.com/ggeorgovassilis/spring-rest-invoker

Para obtener un proxy de cliente basado en esa interfaz, de manera similar a cómo funciona el marco del cliente RestEasys en la tierra JAX-RS.

Funciona en la versión más reciente de Spring.

import org.springframework.web.bind.annotation.RequestMapping;
public interface TestApi {
    @RequestMapping("/test")
    public String test();
}

Implementar la interfaz en el controlador

@RestController
@Slf4j
public class TestApiController implements TestApi {

    @Override
    public String test() {
        log.info("In Test");
        return "Value";
    }

}

Se puede utilizar como: Cliente de descanso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *